• 【Redis】Redis的应用场景


           📝个人主页:五敷有你      

     🔥系列专栏:Redis

    ⛺️稳中求进,晒太阳

    Redis的应用场景:

     限流

    要求10s内只能访问一次
    1. @RequestMapping("xian")
    2. public String xianLiu(String sign){
    3. String sign1 = redisTemplate.opsForValue().get("sign");
    4. if(!StringUtils.isBlank(sign1)){
    5. return "我不可以访问";
    6. }
    7. redisTemplate.opsForValue().set("sign",sign,10, TimeUnit.SECONDS);
    8. return "我可以访问";
    9. }

    10s内只能访问5次
    1. @RequestMapping("/access")
    2. public String access(String id){
    3. Long increase= redisTemplate.opsForValue().increment(id);
    4. redisTemplate.expire(id,10,TimeUnit.SECONDS);
    5. if(increase>5){
    6. return "我不可以访问,10s内访问次数"+increase;
    7. }
    8. return "我可以访问"+increase;
    9. }

    抢红包

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

    给每个红包一个保底1元,让后将剩下的钱进行随机分配

            如果restTime<0,表示红包过期

            如果redis返回null 表示抢完了,返回已抢完

    注意:红包过期时间。

    1. @RequestMapping("/sendRedBags")
    2. public String sendRedBags(Integer uid,Integer money,Integer bags){
    3. Random random = new Random();
    4. Integer[] redBags=new Integer[bags];
    5. Arrays.fill(redBags,1);
    6. int restMoney= money-bags;
    7. for(int i=0;i1;i++){
    8. int bound= restMoney+1;
    9. //最少1元
    10. int mon= random.nextInt(bound);
    11. redBags[i]+=mon;
    12. restMoney=restMoney-mon;
    13. if(restMoney<=0){
    14. break;
    15. }
    16. }
    17. redBags[bags-1]+=restMoney;
    18. System.out.println("uid"+uid+"发送红包: "+Arrays.toString(redBags));
    19. String key="redBags:"+uid;
    20. for (int i = 0; i < bags; i++) {
    21. redisTemplate.opsForList().leftPush(key,redBags[i].toString());
    22. }
    23. redisTemplate.expire(key,20,TimeUnit.SECONDS);
    24. return "ok";
    25. }
    26. @RequestMapping("/getRedBags")
    27. public String getRedBags(Integer uid){
    28. String key="redBags:"+uid;
    29. Long restTime = redisTemplate.getExpire(key,TimeUnit.SECONDS);
    30. System.out.println("红包剩余时间: "+restTime);
    31. if(restTime<=0){
    32. return "红包过期了";
    33. }
    34. String redBags = redisTemplate.opsForList().leftPop(key);
    35. if(StringUtils.isBlank(redBags)){
    36. return "红包抢光了";
    37. }
    38. System.out.println("你抢到的金额: "+redBags);
    39. return "你抢到的金额: "+redBags;
    40. }
    运行结果: 

    看似没有问题,但在redBags中没有东西后,key也就没了,如下:

    当第6次获取红包,就会返回-2,表示没有这个key了,可明明还有时间啊,是value为nil了,key也就没了??

    验证:

    经过验证,确实如果list结构中的value没了之后,key也没了。不用等到过期。

    所以上面判断时间的代码好像就没意义了,修改,简单点!

    1. @RequestMapping("/getRedBags")
    2. public String getRedBags(Integer uid){
    3. String key="redBags:"+uid;
    4. String redBags = redisTemplate.opsForList().leftPop(key);
    5. if(StringUtils.isBlank(redBags)){
    6. return "红包过期了或被抢光了";
    7. }
    8. System.out.println("你抢到的金额: "+redBags);
    9. return "你抢到的金额: "+redBags;
    10. }
  • 相关阅读:
    【网络安全】——sql注入之奇淫巧技bypass(持续更新中)
    【esp32-adf】pipeline源码分析
    ROS安装应用程序
    Docker专题(五)之 端口映射与容器互联
    Matlab:矩阵分解
    多线程的实现方式
    【Postman&JMeter】使用Postman和JMeter进行signature签名
    Open3D RANSAC拟合圆(随机采样一致性)
    Git Bash/GUI Here “找不到应用程序问题
    Jest:JavaScript的单元测试利器
  • 原文地址:https://blog.csdn.net/m0_62645012/article/details/136523163