京东京豆抽奖解决方案
「这是我参与11月更文挑战的第19天,活动详情查看:2021最后一次更文挑战」
一、京东京豆抽奖的业务场景分析
- 京东app首页点击领京豆可进入抽京豆页面
- 每个奖项都有不同的
概率
机会。如:1京豆有1/4机会 - 可以
重复
抽奖,奖池的奖项概率不变
二、京东京豆抽奖的技术方案
京豆抽奖一般是采用redis的set集合来操作的,那为什么是set集合适用于抽奖呢?
- set集合的特点是
元素不重复
(1个京豆 5个京豆 10个京豆 谢谢参与) - set集合支持
随机读取
具体的技术方案是采用set集合的srandmember
命令来实现,随机返回set的一个元素
三、案例实战:SpringBoot+Redis 实现京东京豆抽奖
步骤1:奖品的初始化
由于set集合是不重复,故在奖品初始化的时候,要为每个奖品设置一个序列号。
/**
*提前先把数据刷新到redis缓存中。
*/
@PostConstruct
public void init(){
boolean bo=this.redisTemplate.hasKey(Constants.PRIZE_KEY);
if(!bo){
//按一定的概率初始化奖品
List<String> crowds=this.prize();
crowds.forEach(t->this.redisTemplate.opsForSet().add(Constants.PRIZE_KEY,t));
}
}
/**
*按一定的概率初始化奖品
*/
public List<String> prize() {
List<String> list=new ArrayList<>();
//10个京豆,概率10%
for (int i = 0; i < 10; i++) {
list.add("10-"+i);
}
//5个京豆,概率20%
for (int i = 0; i < 20; i++) {
list.add("5-"+i);
}
//1个京豆,概率60%
for (int i = 0; i < 60; i++) {
list.add("1-"+i);
}
//0个京豆,概率10%
for (int i = 0; i < 10; i++) {
list.add("0-"+i);
}
return list;
}
复制代码
步骤2:抽奖
@GetMapping(value = "/prize")
public String prize() {
String result="";
try {
//随机取1次。
String object = (String)this.redisTemplate.opsForSet().randomMember(Constants.PRIZE_KEY);
if (!StringUtils.isEmpty(object)){
//截取序列号 例如10-1
int temp=object.indexOf('-');
int no=Integer.valueOf(object.substring(0,temp));
switch (no){
case 0:
result="太遗憾啦";
break;
case 1:
result="获得1个京豆";
break;
case 5:
result="获得5个京豆";
break;
case 10:
result="获得10个京豆";
break;
default:
result="太遗憾啦";
}
}
log.info("查询结果:{}", object);
} catch (Exception ex) {
log.error("exception:", ex);
}
return result;
}
复制代码
redis分布式缓存系列
- redis分布式缓存(一)一一 redis安装(linux和docker)
- redis分布式缓存(二)一一 RDB和AOF
- redis分布式缓存(三)一一 SpringBoot集成Mybatis-Plus,Redis和Swagger
- redis分布式缓存(四)一一 SpringCache集成Redis
- redis分布式缓存(五)一一 常用命令(String)
- redis分布式缓存(六)一一 文章的阅读量PV解决方案
- redis分布式缓存(七)一一 分布式全局id解决方案
- redis分布式缓存(八)一一 高并发原子性操作(Redis+Lua)
- redis分布式缓存(九)一一 黑客防刷攻击解决方案
- redis分布式缓存(十)一一 常用命令(Hash)
- redis分布式缓存(十一)一一 储存java bean对象业务剖析
- redis分布式缓存(十二)一一 短链接解决方案
- redis分布式缓存(十三)一一 京东购物车解决方案
- redis分布式缓存(十四)一一 分布式session不一致性解决方案
- redis分布式缓存(十五)一一 高可用的用户注册解决方案
- redis分布式缓存(十六)一一 用户发微博解决方案
- redis分布式缓存(十七)一一 常用命令(Set)
- redis分布式缓存(十八)一一 黑名单校验器解决方案
- 文章持续更新中...