本文主要是介绍Redis实战之年会抽奖,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
前言🔍
上一篇:Redis实战之微博点赞
本篇涉及相关命令:Sadd、Spop
示例基于SpringBoot 2.7.14
Sadd
Sadd 命令将一个或多个成员元素加入到集合中,已经存在于集合的成员元素将被忽略。假如集合 key 不存在,则创建一个只包含添加的元素作成员的集合。
返回值:被添加到集合中的新元素的数量,不包括被忽略的元素。
Spop
Spop 命令用于移除并返回集合中的一个随机元素。
示例🚀
年会抽奖就是分1、2、3等奖,再来一些安慰奖。比如说一等奖抽1个人,那从公司员工号中随机抽取一个,再将该号码剔除,也就是每个人最多一次中奖。
controller
/*** @author lonewalker*/
@RequestMapping("/redis")
@RestController
public class RedisController {/*** 初始化数据* @return 提示信息*/@GetMapping("/init")public String init(){return redisSetService.init();}/*** 抽奖* @return 用户id*/@GetMapping("/prizeDraw")public Integer prizeDraw(){return redisSetService.prizeDraw();}
}
Service
/*** @author lonewalker*/
@Slf4j
@Service
public class RedisSetService {/***提前先把数据刷新到redis缓存中。*/public String init(){log.info("启动初始化..........");Boolean checkResult=RedisUtil.checkKey(RedisKey.PRIZE_KEY);if(!checkResult){//模拟加入工号 从DB查询Integer[] employees = new Integer[10];for (int i = 0; i < 10; i++) {employees[i] = i+1;}RedisUtil.setAdd(RedisKey.PRIZE_KEY,employees);}return "初始化数据完成";}public Integer prizeDraw(){String key = RedisKey.PRIZE_KEY;Object userId = RedisUtil.setPop(key);if (ObjectUtil.isNotNull(userId)){return (Integer) userId;}return 0;}
RedisUtil
/*** @author lonewalker*/
@Slf4j
@Component
public class RedisUtil {private static RedisTemplate<String, Object> redisTemplate;@Autowiredpublic void setRedisTemplate(RedisTemplate<String, Object> redisTemplate) {RedisUtil.redisTemplate = redisTemplate;}/*** 检查是否已存在key* @param key 键* @return true代表已存在*/public static Boolean checkKey(String key){try {return redisTemplate.hasKey(key);} catch (Exception e) {e.printStackTrace();return false;}}/*** 将一个或多个成员元素加入到集合中,已经存在于集合的成员元素将被忽略。* @param key 键* @param values 值* @return 被添加到集合中的新元素的数量,不包括被忽略的元素。*/public static Long setAdd(String key, Object... values) {try {return redisTemplate.opsForSet().add(key, values);} catch (Exception e) {e.printStackTrace();return 0L;}}/*** 用于移除并返回集合中的一个随机元素。* @param key 键* @return 被移除的随机元素。 当集合不存在或是空集时,返回 nil 。*/public static Object setPop(String key){try {return redisTemplate.opsForSet().pop(key);} catch (Exception e) {e.printStackTrace();return null;}}
}
常量
public class RedisKey {/*** 抽奖*/public static final String PRIZE_KEY = "prize";}
测试
抽到4号
就把4号剔除了
扩展🧲
Srandmember 命令用于返回集合中的一个随机元素。Srandmember 命令接受可选的 count 参数:
- 如果 count 为正数,且小于集合基数,那么命令返回一个包含 count 个元素的数组,数组中的元素各不相同。如果 count 大于等于集合基数,那么返回整个集合。
- 如果 count 为负数,那么命令返回一个数组,数组中的元素可能会重复出现多次,而数组的长度为 count 的绝对值。
该操作和 Spop 相似,但 Spop 将随机元素从集合中移除并返回,而 Srandmember 则仅仅返回随机元素,而不对集合进行任何改动。
这篇关于Redis实战之年会抽奖的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!