1、分析
- 公司年底要做年会所有的员工都要参与抽奖的环节
- 平台的产品要进行抽奖活动
这个时候我们可以利用redis中的set集合中的spop来实现。
特征:抽奖成功的人会自动从集合中删除,即获取到奖品的人不再继续参与抽奖。
spop命令:随机返回元素,元素从集合中删除该元素
2、初始化名单数据
package com.example.service; import lombok.extern.slf4j.slf4j; import org.springframework.beans.factory.annotation.autowired; import org.springframework.data.redis.core.redistemplate; import org.springframework.stereotype.service; import javax.annotation.postconstruct; import java.util.arraylist; import java.util.list; /** * @auther: 长颈鹿 * @date: 2021/08/21/14:09 * @description: */ @service @slf4j public class spoprandomsetservice { @autowired private redistemplate redistemplate; private static final string spop_user_sets = "pop:user:set"; // 把所有员工全部添加到集合列表中 @postconstruct public void initdata(){ log.info("初始化奖品等级信息..."); // 判断集合是否已经存在 boolean flag = this.redistemplate.haskey(spop_user_sets); // 防止作弊 if (!flag) { // 获取所有员工的信息 list<integer> initdatalist = initdatalist(); // 把员工信息写入到redis中 sadd key data initdatalist.foreach(data -> this.redistemplate.opsforset().add(spop_user_sets, data)); } } // 模拟100用户抽奖 private list<integer> initdatalist() { // todo : 从数据库里面来,把公司里面所有的员工从数据表中全部查询出来 list<integer> listdata = new arraylist<>(); for (int i = 0; i < 100; i++) { listdata.add(i + 1); } return listdata; } }
3、具体抽奖方法
// 随机抽取用户 public int start(){ return (int)redistemplate.opsforset().pop(spop_user_sets); }
4、抽奖接口测试
package com.example.controller; import com.example.service.spoprandomsetservice; import org.springframework.beans.factory.annotation.autowired; import org.springframework.web.bind.annotation.postmapping; import org.springframework.web.bind.annotation.restcontroller; /** * @auther: 长颈鹿 * @date: 2021/08/21/14:13 * @description: 抽奖接口测试 */ @restcontroller public class spoprandomsetcontroller { @autowired private spoprandomsetservice spoprandomsetservice; @postmapping("/spop/random/user") public int start() { return spoprandomsetservice.start(); } }
5、小结
# 查询集合成员 smembers pop:user:set # 查询集合的长度变化 scard pop:user:set
spop:随机从集合取出一个元素返回,并且从集合中删除该元素。
到此这篇关于基于redis实现抽奖功能的文章就介绍到这了,更多相关redis实现抽奖内容请搜索www.887551.com以前的文章或继续浏览下面的相关文章希望大家以后多多支持www.887551.com!