网站开发专业是干嘛的,深圳餐饮设计公司,河北网络建站,影楼网站模版#x1f4dd;个人主页#xff1a;五敷有你 #x1f525;系列专栏#xff1a;Redis
⛺️稳中求进#xff0c;晒太阳 Redis的应用场景#xff1a; 限流
要求10s内只能访问一次 RequestMapping(xian)public String xianLiu(String sign){String sign1 … 个人主页五敷有你 系列专栏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(increase5){return 我不可以访问,10s内访问次数increase;}return 我可以访问increase;} 抢红包
要求 所有人抢到金额之和等于红包金额不能少于10元。每个人至少抢到1快钱。保证所有人抢到金额的几率相等
实现思路
给每个红包一个保底1元让后将剩下的钱进行随机分配 如果restTime0,表示红包过期 如果redis返回null 表示抢完了返回已抢完
注意红包过期时间。 RequestMapping(/sendRedBags)public String sendRedBags(Integer uid,Integer money,Integer bags){Random random new Random();Integer[] redBagsnew Integer[bags];Arrays.fill(redBags,1);int restMoney money-bags;for(int i0;ibags-1;i){int bound restMoney1;//最少1元int mon random.nextInt(bound);redBags[i]mon;restMoneyrestMoney-mon;if(restMoney0){break;}}redBags[bags-1]restMoney;System.out.println(uiduid发送红包: Arrays.toString(redBags));String keyredBags: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 keyredBags:uid;Long restTime redisTemplate.getExpire(key,TimeUnit.SECONDS);System.out.println(红包剩余时间: restTime);if(restTime0){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 keyredBags:uid;String redBags redisTemplate.opsForList().leftPop(key);if(StringUtils.isBlank(redBags)){return 红包过期了或被抢光了;}System.out.println(你抢到的金额: redBags);return 你抢到的金额: redBags;}