赞
踩
Redisson在基于NIO的Netty框架上,充分的利用了Redis键值数据库提供的⼀系列优势,为使用者提供了⼀系列具有分布式特性的常用⼯具类。
一款基于Redis+看门狗机制的分布式锁框架
1、互斥性
和我们本地锁⼀样互斥性是最基本,但是分布式锁需要保证在不同节点的不同线程的互斥。
2、可重⼊性
同⼀个节点上的同⼀个线程如果获取了锁之后那么也可以再次获取这个锁。
3、锁超时
和本地锁⼀样⽀持锁超时,加锁成功之后设置超时时间,以防⽌线程故障导致不释放锁,防⽌死锁。
4、⾼效,⾼可⽤
加锁和解锁需要⾼效,同时也需要保证⾼可⽤防⽌分布式锁失效,可以增加降级。
redission是基于redis的,redis的故障就会导致redission锁的故障,因此redission⽀持单节点redis、reids主从、reids集群
5、⽀持阻塞和⾮阻塞
和 ReentrantLock ⼀样⽀持 lock 和 trylock 以及 tryLock(long timeOut)
//获取公平锁——按照线程的先后顺序获取锁
RLock lock = redissonClient.getFairLock(skuId);
//获取⾮公平锁——多个线程随机获取锁
RLock lock = redissonClient.getLock(skuId);
//阻塞锁——不断尝试获取锁,直到获取到锁为⽌(加锁成功后,默认因线程故障超时时间为30s后释放锁;开启看⻔狗,剩5s延⻓过期时间)
lock.lock();
//阻塞锁(如果加锁成功之后,设置⾃定义20s的超时时间)
lock.lock(20,TimeUnit.SECONDS);
//⾮阻塞锁——在指定时间内不断获取锁(3秒内不断尝试获取线程加锁,默认因线程故障超时时间为30s后释放锁)
boolean b = lock.tryLock(3,TimeUnit.SECONDS);
//⾮阻塞锁(设置等待时间为3s;如果加锁成功设置⾃定义超时时间为20s)
boolean b = lock.tryLock(3,20,TimeUnit.SECONDS);
lock.unlock();
//公平⾮阻塞锁
RLock lock = redissonClient.getFairLock(skuId);
boolean b = lock.tryLock(3,20,TimeUnit.SECONDS);
<dependency>
<groupId>org.redisson</groupId>
<artifactId>redisson</artifactId>
<version>3.12.0</version>
</dependency>
redisson:
addr:
singleAddr:
host: redis://47.96.11.185:6370
password: 12345678
database: 0
@Configuration public class RedissonConfig { @Value("${redisson.addr.singleAddr.host}") private String host; @Value("${redisson.addr.singleAddr.password}") private String password; @Value("${redisson.addr.singleAddr.database}") private int database; @Bean public RedissonClient redissonClient(){ Config config = new Config(); config.useSingleServer().setAddress(host).setPassword(password).setDatabase(database); return Redisson.create(config); } }
HashMap map = null;
加锁
try{
if(isLock){
校验库存
if(库存充⾜){
保存订单
保存快照
修改库存
删除购物⻋
map &
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。