请选择 进入手机版 | 继续访问电脑版

[Redis] 基于Redis实现抽奖功能及题目 小结

[复制链接]
查看107 | 回复6 | 2021-9-14 00:32:28 | 显示全部楼层 |阅读模式

1、分析

  • 公司年底要做年会全部 的员工都要参与抽奖的环节
  • 平台的产品要举行 抽奖活动

这个时间 我们可以利用 redis中的set集合中的spop来实现。

特性 :抽奖成功的人会主动 从集合中删除,即获取到奖品的人不再继续参与抽奖。

  1. spop命令:随机返回元素,元素从集合中删除该元素
复制代码

2、初始化名单数据

  1. package com.example.service;
  2. import lombok.extern.slf4j.Slf4j;
  3. import org.springframework.beans.factory.annotation.Autowired;
  4. import org.springframework.data.redis.core.RedisTemplate;
  5. import org.springframework.stereotype.Service;
  6. import javax.annotation.PostConstruct;
  7. import java.util.ArrayList;
  8. import java.util.List;
  9. /**
  10. * @Auther: 长颈鹿
  11. * @Date: 2021/08/21/14:09
  12. * @Description:
  13. */
  14. @Service
  15. @Slf4j
  16. public class SpopRandomSetService {
  17. @Autowired
  18. private RedisTemplate redisTemplate;
  19. private static final String SPOP_USER_SETS = "pop:user:set";
  20. // 把所有员工全部添加到集合列表中
  21. @PostConstruct
  22. public void initData(){
  23. log.info("初始化奖品等级信息...");
  24. // 判断集合是否已经存在
  25. boolean flag = this.redisTemplate.hasKey(SPOP_USER_SETS);
  26. // 防止作弊
  27. if (!flag) {
  28. // 获取所有员工的信息
  29. List<Integer> initDataList = initDataList();
  30. // 把员工信息写入到redis中 sadd key data
  31. initDataList.forEach(data -> this.redisTemplate.opsForSet().add(SPOP_USER_SETS, data));
  32. }
  33. }
  34. // 模拟100用户抽奖
  35. private List<Integer> initDataList() {
  36. // todo : 从数据库里面来,把公司里面所有的员工从数据表中全部查询出来
  37. List<Integer> listData = new ArrayList<>();
  38. for (int i = 0; i < 100; i++) {
  39. listData.add(i + 1);
  40. }
  41. return listData;
  42. }
  43. }
复制代码

3、具体 抽奖方法

  1. // 随机抽取用户
  2. public int start(){
  3. return (int)redisTemplate.opsForSet().pop(SPOP_USER_SETS);
  4. }
复制代码

4、抽奖接口测试

  1. package com.example.controller;
  2. import com.example.service.SpopRandomSetService;
  3. import org.springframework.beans.factory.annotation.Autowired;
  4. import org.springframework.web.bind.annotation.PostMapping;
  5. import org.springframework.web.bind.annotation.RestController;
  6. /**
  7. * @Auther: 长颈鹿
  8. * @Date: 2021/08/21/14:13
  9. * @Description: 抽奖接口测试
  10. */
  11. @RestController
  12. public class SpopRandomSetController {
  13. @Autowired
  14. private SpopRandomSetService spopRandomSetService;
  15. @PostMapping("/sPop/random/user")
  16. public int start() {
  17. return spopRandomSetService.start();
  18. }
  19. }
复制代码

5、小结

  1. # 查询集合成员
  2. smembers pop:user:Set
  3. # 查询集合的长度变化
  4. scard pop:user:Set
复制代码

spop:随机从集合取出一个元素返回,并且从集合中删除该元素。

到此这篇关于基于Redis实现抽奖功能的文章就先容 到这了,更多干系 Redis实现抽奖内容请搜索 脚本之家从前 的文章或继续欣赏 下面的干系 文章渴望 大家以后多多支持脚本之家!


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

avatar ssffgsa | 2021-9-17 04:29:54 | 显示全部楼层
信admin楼主,考试不挂科!
回复

使用道具 举报

avatar 飞一航符cx | 2021-10-4 10:01:50 | 显示全部楼层
看帖、回帖、拿分、走人
回复

使用道具 举报

avatar yfyffuuy | 2021-10-4 17:11:45 | 显示全部楼层
admin楼主你想太多了!
回复

使用道具 举报

avatar 刘金栋 | 2021-10-8 10:12:21 | 显示全部楼层
强,我和我的小伙伴们都惊呆了!
回复

使用道具 举报

avatar 国留局劳 | 2021-10-10 12:25:02 | 显示全部楼层
吹牛的人越来越多了!
回复

使用道具 举报

admin楼主是我最崇拜的人!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则