IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> springboot + redis(兼容单机、哨兵、集群) + 分布式锁模拟抢手机 -> 正文阅读

[大数据]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文件中添加<!-- 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        : 亏大了,手机被抢光了!

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2022-06-14 22:40:05  更:2022-06-14 22:44:56 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/19 22:26:29-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码