redis + java 点名器

使用redis的set类型
项目启动后将数据储存放到redis中
要求页面输入获奖人数,然后点击抽检,页面打印出中奖名单
使用两种方案,第一种中奖的人依旧可以中奖,第二种中将的人不能中奖
页面显示出当前的中奖名单,并且实时同步出可以中奖人的数据池

使用redis的set类型可以实现你的需求,因为set类型可以存储不重复的数据,并且可以随机获取元素。你可以参考以下的思路和伪代码:

项目启动后,将数据储存放到redis中,使用一个set类型的键,例如"candidates",并且记录总人数,例如"total"。
页面输入获奖人数n,然后点击抽奖,页面调用后端的抽奖接口。
后端的抽奖接口根据不同的方案来实现:
第一种方案:中奖的人依旧可以中奖。这种情况下,只需要从"candidates"中随机获取n个元素,然后返回给前端。不需要修改redis中的数据。
第二种方案:中奖的人不能中奖。这种情况下,需要从"candidates"中随机获取n个元素,并且将它们从"candidates"中移除,同时更新"total"的值。然后返回给前端。
前端接收到后端返回的中奖名单,显示在页面上,并且实时同步出可以中奖人的数据池,即"total"的值。
以下是一些伪代码:

// 后端 // 项目启动后,将数据储存放到redis中 function init() { // 假设data是一个数组,存储了所有候选人的名字 // 连接redis let redis = connectRedis(); // 清空redis redis.flushdb(); // 将data中的元素添加到candidates集合中 redis.sadd(“candidates”, …data); // 将data的长度保存到total键中 redis.set(“total”, data.length); }

// 抽奖接口 function draw(n, scheme) { // 参数n是获奖人数,scheme是方案(1或2) // 连接redis let redis = connectRedis(); // 定义一个数组,存储中奖名单 let winners = []; // 根据方案执行不同的逻辑 if (scheme == 1) { // 方案一:中奖的人依旧可以中奖 // 随机从candidates集合中获取n个元素 winners = redis.srandmember(“candidates”, n); // 不需要修改redis中的数据 } else if (scheme == 2) { // 方案二:中奖的人不能中奖 // 随机从candidates集合中弹出n个元素,并返回它们 winners = redis.spop(“candidates”, n); // 更新total键的值,减去n redis.decrby(“total”, n); } // 返回winners数组给前端 return winners; }

// 前端 // 页面输入获奖人数n,然后点击抽奖按钮 function onClick() { // 获取输入框和选择框的值 let n = getInputValue(); let scheme = getSelectValue(); // 调用后端的抽奖接口,并传入参数n和scheme let winners = callDrawApi(n, scheme); // 显示winners数组在页面上,并实时同步出可以中奖人的数据池(即total键的值) showWinners(winners); }