基于Redis实现抽奖功能及问题小结
短信预约 -IT技能 免费直播动态提醒
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;
@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;
@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实现抽奖内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341