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 : 亏大了,手机被抢光了!