📝个人主页:五敷有你
🔥系列专栏:Redis
⛺️稳中求进,晒太阳
Redis的应用场景:
限流
要求10s内只能访问一次
@RequestMapping("xian")
public String xianLiu(String sign){
String sign1 = redisTemplate.opsForValue().get("sign");
if(!StringUtils.isBlank(sign1)){
return "我不可以访问";
}
redisTemplate.opsForValue().set("sign",sign,10, TimeUnit.SECONDS);
return "我可以访问";
}
10s内只能访问5次
@RequestMapping("/access")
public String access(String id){
Long increase= redisTemplate.opsForValue().increment(id);
redisTemplate.expire(id,10,TimeUnit.SECONDS);
if(increase>5){
return "我不可以访问,10s内访问次数"+increase;
}
return "我可以访问"+increase;
}
抢红包
要求
- 所有人抢到金额之和等于红包金额,不能少于10元。
- 每个人至少抢到1快钱。
- 保证所有人抢到金额的几率相等
实现思路:
给每个红包一个保底1元,让后将剩下的钱进行随机分配
如果restTime<0,表示红包过期
如果redis返回null 表示抢完了,返回已抢完
注意:红包过期时间。
@RequestMapping("/sendRedBags")
public String sendRedBags(Integer uid,Integer money,Integer bags){
Random random = new Random();
Integer[] redBags=new Integer[bags];
Arrays.fill(redBags,1);
int restMoney= money-bags;
for(int i=0;i<bags-1;i++){
int bound= restMoney+1;
//最少1元
int mon= random.nextInt(bound);
redBags[i]+=mon;
restMoney=restMoney-mon;
if(restMoney<=0){
break;
}
}
redBags[bags-1]+=restMoney;
System.out.println("uid"+uid+"发送红包: "+Arrays.toString(redBags));
String key="redBags:"+uid;
for (int i = 0; i < bags; i++) {
redisTemplate.opsForList().leftPush(key,redBags[i].toString());
}
redisTemplate.expire(key,20,TimeUnit.SECONDS);
return "ok";
}
@RequestMapping("/getRedBags")
public String getRedBags(Integer uid){
String key="redBags:"+uid;
Long restTime = redisTemplate.getExpire(key,TimeUnit.SECONDS);
System.out.println("红包剩余时间: "+restTime);
if(restTime<=0){
return "红包过期了";
}
String redBags = redisTemplate.opsForList().leftPop(key);
if(StringUtils.isBlank(redBags)){
return "红包抢光了";
}
System.out.println("你抢到的金额: "+redBags);
return "你抢到的金额: "+redBags;
}
运行结果:
看似没有问题,但在redBags中没有东西后,key也就没了,如下:
当第6次获取红包,就会返回-2,表示没有这个key了,可明明还有时间啊,是value为nil了,key也就没了??
验证:
经过验证,确实如果list结构中的value没了之后,key也没了。不用等到过期。
所以上面判断时间的代码好像就没意义了,修改,简单点!
@RequestMapping("/getRedBags")
public String getRedBags(Integer uid){
String key="redBags:"+uid;
String redBags = redisTemplate.opsForList().leftPop(key);
if(StringUtils.isBlank(redBags)){
return "红包过期了或被抢光了";
}
System.out.println("你抢到的金额: "+redBags);
return "你抢到的金额: "+redBags;
}