自学内容网 自学内容网

【Redis】Redis的应用场景

       📝个人主页:五敷有你      

 🔥系列专栏: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;

    }

抢红包

要求
  1.   所有人抢到金额之和等于红包金额,不能少于10元。
  2. 每个人至少抢到1快钱。
  3. 保证所有人抢到金额的几率相等
实现思路:

给每个红包一个保底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;


    }

原文地址:https://blog.csdn.net/m0_62645012/article/details/136523163

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!