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



















