spring boot:用redis+redisson实现分布式锁(redisson3.11.1/spring boot 2.2)
一,为什么要使用分布式锁?
说明:刘宏缔的架构森林是一个专注架构的博客,地址:https://www.cnblogs.com/architectforest
对应的源码可以访问这里获取: https://github.com/liuhongdi/
说明:作者:刘宏缔 邮箱: 371125307@qq.com
二,使用redisson
https://redisson.org/
https://github.com/redisson/redisson/wiki
三,演示项目的相关信息
https://github.com/liuhongdi/distributedlock

CREATE TABLE `goods` (
`goods_id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'id',
`goods_name` varchar(500) NOT NULL DEFAULT '' COMMENT 'name',
`stock` int(11) NOT NULL DEFAULT '0' COMMENT 'stock',
PRIMARY KEY (`goods_id`)
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='商品表'
四,java代码的说明
@Service
public class OrderServiceImpl implements OrderService { @Resource
private RedissonClient redissonClient;
@Resource
private GoodsMapper goodsMapper; /*
* 加锁减库存
* */
@Override
public boolean decrementProductStoreLock(int goodsId, int buyNum) {
String key = "dec_store_lock_" + goodsId;
//生成锁对象
RLock lock = redissonClient.getLock(key);
try {
//2, TimeUnit.MINUTES
lock.lock(2, TimeUnit.MINUTES);
boolean upRes = updateGoodsStock(goodsId, buyNum);
if (upRes == false) {
return false;
}
} catch (Exception e) {
System.out.println(e.getMessage());
return false;
} finally {
//解锁
if (lock.isHeldByCurrentThread()){
System.out.println("----------------release lock");
lock.unlock();
}
}
return true;
} /*
* 减库存
* */
@Transactional(isolation = Isolation.REPEATABLE_READ)
public boolean updateGoodsStock(int goodsId, int buyNum) {
Goods goodsOne = goodsMapper.selectOneGoods(goodsId);
System.out.println("-------------------------当前库存:"+goodsOne.getStock()+"-------购买数量:"+buyNum);
if (goodsOne.getStock() < buyNum || goodsOne.getStock() <= 0) {
System.out.println("------------------------fail:buy fail,return");
return false;
}
int upStock = goodsOne.getStock()-buyNum;
goodsOne.setStock(upStock);
int upNum = goodsMapper.updateOneGoodsStock(goodsOne);
System.out.println("-------------------------success:成交订单数量:"+upNum);
return true;
} /*
* 不加锁减库存
* */
@Override
public boolean decrementProductStoreNoLock(int goodsId, int buyNum) {
return updateGoodsStock(goodsId, buyNum);
}
}
五,测试高并发时加锁的效果:
mysql> update goods set stock=3;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0 mysql> select * from goods;
+----------+------------+-------+
| goods_id | goods_name | stock |
+----------+------------+-------+
| 3 | green cup2 | 3 |
+----------+------------+-------+
1 row in set (0.00 sec)
我们设置商品的库存数为3
[root@localhost ~]# ab -c 20 -n 20 http://127.0.0.1:8080/lock/buynolock
查看代码的打印输出:
-------------------------当前库存:3-------购买数量:1
-------------------------success:成交订单数量:1
-------------------------当前库存:2-------购买数量:1
-------------------------success:成交订单数量:1
-------------------------当前库存:1-------购买数量:1
-------------------------当前库存:1-------购买数量:1
-------------------------当前库存:1-------购买数量:1
-------------------------success:成交订单数量:1
-------------------------当前库存:0-------购买数量:1
------------------------fail:buy fail,return
-------------------------当前库存:0-------购买数量:1
------------------------fail:buy fail,return
-------------------------当前库存:0-------购买数量:1
------------------------fail:buy fail,return
-------------------------当前库存:0-------购买数量:1
------------------------fail:buy fail,return
-------------------------当前库存:0-------购买数量:1
------------------------fail:buy fail,return
-------------------------当前库存:0-------购买数量:1
------------------------fail:buy fail,return
-------------------------当前库存:0-------购买数量:1
------------------------fail:buy fail,return
-------------------------当前库存:0-------购买数量:1
------------------------fail:buy fail,return
-------------------------当前库存:0-------购买数量:1
------------------------fail:buy fail,return
-------------------------当前库存:0-------购买数量:1
------------------------fail:buy fail,return
-------------------------当前库存:0-------购买数量:1
------------------------fail:buy fail,return
-------------------------当前库存:0-------购买数量:1
------------------------fail:buy fail,return
-------------------------success:成交订单数量:1
-------------------------当前库存:0-------购买数量:1
------------------------fail:buy fail,return
-------------------------success:成交订单数量:1
-------------------------当前库存:0-------购买数量:1
------------------------fail:buy fail,return
-------------------------当前库存:0-------购买数量:1
------------------------fail:buy fail,return
[root@localhost ~]# ab -c 20 -n 20 http://127.0.0.1:8080/lock/buylock
查看代码的打印输出:
-------------------------当前库存:3-------购买数量:1
-------------------------success:成交订单数量:1
-------------------------当前库存:2-------购买数量:1
-------------------------success:成交订单数量:1
-------------------------当前库存:1-------购买数量:1
-------------------------success:成交订单数量:1
-------------------------当前库存:0-------购买数量:1
------------------------fail:buy fail,return
-------------------------当前库存:0-------购买数量:1
------------------------fail:buy fail,return
-------------------------当前库存:0-------购买数量:1
------------------------fail:buy fail,return
-------------------------当前库存:0-------购买数量:1
------------------------fail:buy fail,return
-------------------------当前库存:0-------购买数量:1
------------------------fail:buy fail,return
-------------------------当前库存:0-------购买数量:1
------------------------fail:buy fail,return
-------------------------当前库存:0-------购买数量:1
------------------------fail:buy fail,return
-------------------------当前库存:0-------购买数量:1
------------------------fail:buy fail,return
-------------------------当前库存:0-------购买数量:1
------------------------fail:buy fail,return
-------------------------当前库存:0-------购买数量:1
------------------------fail:buy fail,return
-------------------------当前库存:0-------购买数量:1
------------------------fail:buy fail,return
-------------------------当前库存:0-------购买数量:1
------------------------fail:buy fail,return
-------------------------当前库存:0-------购买数量:1
------------------------fail:buy fail,return
-------------------------当前库存:0-------购买数量:1
------------------------fail:buy fail,return
-------------------------当前库存:0-------购买数量:1
------------------------fail:buy fail,return
-------------------------当前库存:0-------购买数量:1
------------------------fail:buy fail,return
-------------------------当前库存:0-------购买数量:1
------------------------fail:buy fail,return
只成功了3个订单,说明分布式锁有效
六,查看spring boot的版本:
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v2.2.0.RELEASE)
spring boot:用redis+redisson实现分布式锁(redisson3.11.1/spring boot 2.2)的更多相关文章
- 使用Redisson实现分布式锁,Spring AOP简化之
源码 Redisson概述 Redisson是一个在Redis的基础上实现的Java驻内存数据网格(In-Memory Data Grid).它不仅提供了一系列的分布式的Java常用对象,还提供了许多 ...
- Redisson实现分布式锁
转: Redisson实现分布式锁 Redisson文档参考:https://github.com/redisson/redisson/wiki/%E7%9B%AE%E5%BD%95 redis是实现 ...
- 利用Redisson实现分布式锁及其底层原理解析
Redis介绍 参考地址:https://blog.csdn.net/turbo_zone/article/details/83422215 redis是一个key-value存储系统.和Memcac ...
- Springboot中使用Redisson实现分布式锁
1. 概述 老话说的好:便宜没好货,有价值的商品,即使再贵,也有人会买. 言归正传,今天继续讨论有关"锁"的话题,synchronized 和 ReentrantLock 大家应该 ...
- redis客户端、分布式锁及数据一致性
Redis Java客户端有很多的开源产品比如Redission.Jedis.lettuce等. Jedis是Redis的Java实现的客户端,其API提供了比较全面的Redis命令的支持:Redis ...
- Redis系列(二)--分布式锁、分布式ID简单实现及思路
分布式锁: Redis可以实现分布式锁,只是讨论Redis的实现思路,而真的实现分布式锁,Zookeeper更加可靠 为什么使用分布式锁: 单机环境下只存在多线程,通过同步操作就可以实现对并发环境的安 ...
- Redisson实现分布式锁(3)—项目落地实现
Redisson实现分布式锁(3)-项目落地实现 有关Redisson实现分布式锁前面写了两篇博客作为该项目落地的铺垫. 1.Redisson实现分布式锁(1)---原理 2.Redisson实现分布 ...
- Redisson实现分布式锁(2)—RedissonLock
Redisson实现分布式锁(2)-RedissonLock 有关Redisson实现分布式锁上一篇博客讲了分布式的锁原理:Redisson实现分布式锁---原理 这篇主要讲RedissonLock和 ...
- Redisson实现分布式锁(1)---原理
Redisson实现分布式锁(1)---原理 有关Redisson作为实现分布式锁,总的分3大模块来讲. 1.Redisson实现分布式锁原理 2.Redisson实现分布式锁的源码解析 3.Redi ...
随机推荐
- Kubernetes的资源控制器和Service(四)
一.定义和分类 1,定义 k8s 中内建了很多控制器(controller ),这些相当于一个状态机,用来控制 Pod 的具体状态和行为. 2,类型 ReplicationController.Rep ...
- Java面试炼金系列 (1) | 关于String类的常见面试题剖析
Java面试炼金系列 (1) | 关于String类的常见面试题剖析 文章以及源代码已被收录到:https://github.com/mio4/Java-Gold 0x0 基础知识 1. '==' 运 ...
- nginx安装步骤和加固方案
安装步骤参考https://blog.csdn.net/qq_37345604/article/details/90034424 出现以下页面就表示安装完成(默认是80端口,我修改成了8009端口,所 ...
- oracle之二表和表空间的关系
表和表空间的关系 建一个使用缺省值的表空间SQL> create tablespace a datafile '/u01/data/urpdb/a01.dbf' size 10m; 利用orac ...
- python中多进程multiprocessing、多线程threading、线程池threadpool
浅显点理解:进程就是一个程序,里面的线程就是用来干活的,,,进程大,线程小 一.多线程threading 简单的单线程和多线程运行:一个参数时,后面要加逗号 步骤:for循环,相当于多个线程——t=t ...
- 吴恩达《深度学习》-第五门课 序列模型(Sequence Models)-第三周 序列模型和注意力机制(Sequence models & Attention mechanism)-课程笔记
第三周 序列模型和注意力机制(Sequence models & Attention mechanism) 3.1 序列结构的各种序列(Various sequence to sequence ...
- 教你一招Linux下文本比对方法
我们在写代码的过程中,免不了会对代码进行一些修修改改.但经常会出现改着改着,就不知道改完后与源文件的差异是怎样的.这里,我们就需要一个文本比对工具来进行文本比对. 有经验的程序员都知道,Windows ...
- 想写一篇jvm的工具入门
为什么要写一个jvm的工具入门呢,一是自己也不会,二是因为不会所以想学一下,还有就是这个确实很重要,对学习jvm有很多的用处,对定位问题有很大的便利,以前毕业那会我记得有个笔试,知道JAVA_HOME ...
- 云计算openstack——高可以负载均衡(14)
一.云平台概要 1.本openstack云平台使用开源软件Openstack Ocata版…… 2.OpenStack 部署环境中,各节点可以分为几类: Cloud Controller Node ( ...
- Hashmap,Set,Map,List,ArrayList的区别
表格: 类型 默认容量 加载因子[1] 扩容增量 底层实现 是否安全及同步方式 Vector 10 1 2倍 Object数组 安全,synchronized ArrayList 10 1 1.5倍( ...