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

14 篇文章 1 订阅
7 篇文章 0 订阅

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文件中添加<!-- redis --><dependency> <groupId>org.springframework.boot</groupId> &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.编写接口添加手机

/**
     * 添加手机
     *
     * @param phoneName : 手机名称
     * @param number : 添加数量
     * @author kevin
     * @date 2022/6/9
     */
    @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.编写抢手机接口

/**
     * 测试redis分布式锁,秒杀抢手机(一个用户只能抢一个手机)
     *
     * @author kevin
     * @date 2022/6/9
     */
    @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        : 亏大了,手机被抢光了!

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值