栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

springboot + redis(兼容单机、哨兵、集群) + 分布式锁模拟抢手机

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

springboot + redis(兼容单机、哨兵、集群) + 分布式锁模拟抢手机

redis环境的搭建,可参考博主的文章

windows环境下 单机、集群、哨兵模式的redis环境_min开发的博客-CSDN博客windows环境下redis单机、集群、哨兵的部署https://blog.csdn.net/liu649983697/article/details/125184688如何集成redis,参考博主的文章:

springboot+redis集群接入集成,多集群多连接池多数据源,redis工具类_min开发的博客-CSDN博客_redis集群使用连接池目录1.添加maven依赖,pom文件中添加2.添加yml中redis配置项3.配置luttuce连接池template4.编写redis工具类5.使用redis不写一大篇废话了,redis介绍啊等等东西百度吧。直接上集成步骤1.添加maven依赖,pom文件中添加 org.springframework.boot &https://blog.csdn.net/liu649983697/article/details/119794541如何实现分布式锁,可参考博主的文章 redis分布式锁实现的两种方式 lua脚本与redisson,解决自定义超时后锁自动续期失效问题_min开发的博客-CSDN博客redis分布式锁的实现,两种实现方式:lua脚本、redisson,以及解决使用redisson时自定义锁超时时间后,锁无法自动续期问题https://blog.csdn.net/liu649983697/article/details/125147689

 1.编写接口添加手机
    @PostMapping("/addPhone")
    public ResponseVo addPhone(@RequestParam("phoneName")String phoneName, @RequestParam("number") Integer number) {
        String lockKey = phoneName + "_lock";
        boolean locked = redisUtils.getLock(lockKey, 1, 5, 0);
        if (locked) {
            //获取到锁,开始添加手机
            redisUtils.incr(phoneName, number);
            //添加手机完成,释放锁
            redisUtils.releaseLock(lockKey, 1);
        } else {
            //没取到锁
            log.info("获取锁失败,未获取到锁,业务逻辑未处理!");
        }
        return new ResponseVo.Builder().ok().build();
    }
2.编写抢手机接口
    @PostMapping("/snatchPhone")
    public ResponseVo snatchPhone(@RequestParam("phoneName") String phoneName, @RequestParam("userName") String userName) {
        String lockKey = phoneName + "_lock";
        boolean locked = redisUtils.getLock(lockKey, 1, 5, 1);
        if (locked) {
            try {
                String userSnatchPhoneKey = userName + "_" + phoneName;
                if (Boolean.TRUE.equals(redisUtils.hasKey(userSnatchPhoneKey))) {
                    log.info("好吧,原来我已经抢到 " + phoneName + " 手机了!");
                } else {
                    Object phoneNum = redisUtils.get(phoneName);
                    if(null == phoneNum || Integer.parseInt("" + phoneNum) < 1){
                        log.info("亏大了,手机被抢光了!");
                    } else {
                        Long result = redisUtils.decr(phoneName, 1);
                        log.info("我抢到 " + phoneName + " 手机了, 还剩:" + result + "个!");
                        //此处就可以使用消息队列处理生成支付订单了
                        redisUtils.set(userSnatchPhoneKey, 1);
                    }
                }
            }catch (RuntimeException e){
                log.info("好像出了点小问题呢,请稍后再试!");
            }finally {
                //处理业务结束,释放锁
                redisUtils.releaseLock(lockKey, 1);
            }
        } else {
            //没取到锁
            log.info("太可惜了,我没抢到 " + phoneName + " 手机,再试一次吧!");
        }
        return new ResponseVo.Builder().ok().build();
    }
3.使用jmeter进行并发测试

 

2022-06-09 18:40:46.422  INFO 52736 --- [o-8081-exec-119] com.liu.controller.TestController        : 我抢到 iphone 13 plus x 手机了, 还剩:9个!
2022-06-09 18:40:46.436  INFO 52736 --- [o-8081-exec-117] com.liu.controller.TestController        : 我抢到 iphone 13 plus x 手机了, 还剩:8个!
2022-06-09 18:40:46.444  INFO 52736 --- [o-8081-exec-204] com.liu.controller.TestController        : 我抢到 iphone 13 plus x 手机了, 还剩:7个!
2022-06-09 18:40:46.457  INFO 52736 --- [o-8081-exec-207] com.liu.controller.TestController        : 我抢到 iphone 13 plus x 手机了, 还剩:6个!
2022-06-09 18:40:46.769  INFO 52736 --- [o-8081-exec-117] com.liu.controller.TestController        : 我抢到 iphone 13 plus x 手机了, 还剩:5个!
2022-06-09 18:40:46.785  INFO 52736 --- [o-8081-exec-216] com.liu.controller.TestController        : 我抢到 iphone 13 plus x 手机了, 还剩:4个!
2022-06-09 18:40:46.796  INFO 52736 --- [o-8081-exec-278] com.liu.controller.TestController        : 我抢到 iphone 13 plus x 手机了, 还剩:3个!
2022-06-09 18:40:46.928  INFO 52736 --- [o-8081-exec-322] com.liu.controller.TestController        : 我抢到 iphone 13 plus x 手机了, 还剩:2个!
2022-06-09 18:40:46.955  INFO 52736 --- [o-8081-exec-117] com.liu.controller.TestController        : 我抢到 iphone 13 plus x 手机了, 还剩:1个!
2022-06-09 18:40:46.997  INFO 52736 --- [o-8081-exec-216] com.liu.controller.TestController        : 我抢到 iphone 13 plus x 手机了, 还剩:0个!
2022-06-09 18:40:47.036  INFO 52736 --- [o-8081-exec-238] com.liu.controller.TestController        : 亏大了,手机被抢光了!
2022-06-09 18:40:47.095  INFO 52736 --- [o-8081-exec-246] com.liu.controller.TestController        : 亏大了,手机被抢光了!
2022-06-09 18:40:47.101  INFO 52736 --- [o-8081-exec-231] com.liu.controller.TestController        : 亏大了,手机被抢光了!
2022-06-09 18:40:47.107  INFO 52736 --- [o-8081-exec-306] com.liu.controller.TestController        : 亏大了,手机被抢光了!
2022-06-09 18:40:47.114  INFO 52736 --- [o-8081-exec-267] com.liu.controller.TestController        : 亏大了,手机被抢光了!
2022-06-09 18:40:47.119  INFO 52736 --- [o-8081-exec-351] com.liu.controller.TestController        : 亏大了,手机被抢光了!
2022-06-09 18:40:47.122  INFO 52736 --- [o-8081-exec-227] com.liu.controller.TestController        : 亏大了,手机被抢光了!
2022-06-09 18:40:47.127  INFO 52736 --- [o-8081-exec-270] com.liu.controller.TestController        : 亏大了,手机被抢光了!
2022-06-09 18:40:47.136  INFO 52736 --- [o-8081-exec-339] com.liu.controller.TestController        : 亏大了,手机被抢光了!
2022-06-09 18:40:47.140  INFO 52736 --- [o-8081-exec-223] com.liu.controller.TestController        : 亏大了,手机被抢光了!
2022-06-09 18:40:47.156  INFO 52736 --- [o-8081-exec-302] com.liu.controller.TestController        : 亏大了,手机被抢光了!

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/961677.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号