📝个人主页:五敷有你
🔥系列专栏: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;}