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 : 亏大了,手机被抢光了!
springboot + redis(兼容单机、哨兵、集群) + 分布式锁模拟抢手机相关推荐
- SpringBoot整合Redis(单机/哨兵/集群)
pom <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http:// ...
- Redlock——Redis集群分布式锁
欢迎关注方志朋的博客,回复"666"获面试宝典 前言 分布式锁是一种非常有用的技术手段.实现高效的分布式锁有三个属性需要考虑: 安全属性:互斥,不管什么时候,只有一个客户端持有锁 ...
- 第一节 Redis 使用及哨兵集群 2022-1-2
Java组件总目录 Redis 使用及哨兵集群 Java组件总目录 一 Redis基本数据类型使用场景 1 String 2 List 存储列表结构 3 Hash 4 Set 5 Zset 二级目录 ...
- C#两大知名Redis客户端连接哨兵集群的姿势
前言 前面<Docker-Compose搭建Redis高可用哨兵集群>, 我的思路是将Redis.Sentinel.Redis Client App链接到同一个网桥网络,这个网桥内的Red ...
- Redis分片主从哨兵集群,原理详解,集群的配置安装,8大数据类型,springboot整合使用
文章目录 Redis介绍 Redis分片 Redis主从 Redis哨兵 Redis集群 Redis持久化策略 RDB AOF 持久化方案选择 Redis内存策略 LRU算法 LFU算法 Random ...
- Redis从入门到集群分布式实践
Redis 分布式实践 一. Redis 初识 1.1 Redis 导学 Redis有哪些特点? 高性能的key-value服务器 多种数据结构 丰富的功能 高可用分布式支持 适合人群: 初学者 进阶 ...
- redis完整笔记总结-数据类型-事务与锁-集群-分布式锁-常见问题(缓存穿透、击穿、雪崩)
1. 数据类型 五大基本类型 String hash -> 类似map list set -> zset -> 基于set的有序集合 新增 bitmaps:其实就是string,主要 ...
- redis学习-主从-哨兵集群-redis-cluster简单日记
1.linux下redis安装及部署 redis安装包与ruby安装包下载 (转)Linux下Redis的安装与部署 2.常用命令及简单配置注解 redis-server redis.conf: 启动 ...
- Redis 集群分布式锁与 API 网关分布式限流
https://www.infoq.cn/article/FoQGIk*BzdQWJJ0tKqrJ Redis 集群的历史 Redis 在 3.0 前一般有两种集群方案,一是 proxy(Twempr ...
最新文章
- 一步一步学习VirtualBox安装CentOS7和CentOS8
- 【转】Python机器学习库
- Android之设置资源图片为圆角图片
- Nginx面试!mysql时间类型以及获取当前时间,干货满满
- .net core项目部署到centos7
- oracle db file sequential read,db file sequential read等待事件
- 带你封装一个上传图片组件(ant design+react)
- oracle实验四运动会,实验四oracle的安全性和完整性控制
- PHP仿代下狗源码-素材代下载搜索引擎系统整站打包
- 改变根深蒂固的流程可以提高客户忠诚度
- Android - Earthquake工程(地震监测) 的 对
- 【买衣服】I'm looking for a jacket
- 如何设计信息安全领域的实时安全基线引擎
- SAI2.0绘画软件中文版(已测可用)
- java--javassist学习
- 关于字符串的长度和大小的定义
- SLC、MLC、TLC和QLC这几种存储颗粒的区别
- 常用手持设备的use-agent头信息
- 将文件从VMWare虚拟机的Linux系统传到U盘
- ppt模板如何制作个性人物海报?
热门文章
- [blender]制作一个low poly wash basin低模洗手盆
- cs231n 课程作业 Assignment 1
- Spring Zuul和Spring Security的整合
- 二十八,打糕蒸馍贴花花
- 师者,传道授业解惑者也:看现在的培训机构和毕业生就业状况
- Linux下修改交换空间swap大小
- MATLAB基于Simulink的行波故障测距 ,提出了基于MATLAB/SIMULINK的输电线路故障行波仿真方法
- 酷壳网陈皓:Why C++?王者归来
- JavaScript中===的用法/编程语言中等号的理解
- 【瑞萨RA6系列】使用TinyMaix识别手写数字