目录
一、Redisson的使用
1.Redisson
Redisson是一个在Redis的基础上实现的Java驻内存管理网络(In-Memory Data Gird), 它不仅提供了一系列的分布式的Java常用对象,还提供了许多分布式服务,其中就包括了各种分布式的实现。
8.分布式锁(Lock)和同步器(Synchronizer)
8.1.可重入锁(Reentrant Lock)
8.2.公平锁(Fair Lock)08.3.联锁(MultiLock)
8.4.红锁(RedLock)
8.5.读写锁(ReadWriteLock)
8.6.信号量(Semaphore)
8.7.可过期性信号量(PermitExpirableSemaphore)
8.8.闭锁(CountDownLatch)
官网地址:Redisson: Redis Java client with features of In-Memory Data Grid
2.导入依赖
这里我们使用maven管理依赖,先导入依赖
<!--redisson--> <dependency> <groupId>org.redisson</groupId> <artifactId>redisson</artifactId> <version>3.13.6</version> </dependency>
3.建立Redssion配置类
public class RedissonConfig { public RedissonClient createRedisson() { //配置 Config config = new Config(); //useSingleServer指的是单例模式,设置redis地址,端口号,密码 config.useSingleServer().setAddress("redis://192.68.23.100:6379").setPassword("zjy123...000"); //创建RedissonClient对象 return Redisson.create(config); } }
4.使用
//使用 @Resource private RedissonClient redissonClient; //例子: RLock lock = redissonClient.getLock("lock"); //获取锁 boolean isLock = lock.tryLock(); //执行业务 //释放锁 lock.unlock("lock");
二、redisson的可重入锁
1.基本原理
利用redis的hash结构存储锁,key值随意,field属性为线程标识,value为锁次数。当线程获取一次锁后,如果此时redis中没有这个锁,则创建并将锁次数置为1;接下来如果线程再次获取锁会进行一次判断。即对比线程标识是否是同一个线程的多次获取,如果是的话锁次数+1。同样的,如果是释放锁的话也需要对线程标识进行判断,然后让对应的锁次数-1,当锁的次数为0时,表示此时可以删除锁了。
2.test
@SpringBootTest class RedissonTest { @Resource private RedissonClient redissonClient; private RLock lock; @BeforeEach void setup() { //对锁进行初始化 lock = redissonClient.getLock("lock"); } // 方法A @Test void A() { //尝试获取锁 boolean isLock = lock.tryLock(); if(!isLock) { System.out.println("获取锁失败。。。1"); return; } try { System.out.println("获取锁成功。。。1"); // 获取锁后调用方法B B(); System.out.println("开始执行业务。。。1"); } finally { System.out.println("准备释放锁。。。1"); lock.unlock(); } } void B() { //尝试获取锁 boolean isLock = lock.tryLock(); if(!isLock) { System.out.println("获取锁失败。。。2"); return; } try { System.out.println("获取锁成功。。。2"); System.out.println("开始执行业务。。。2"); } finally { System.out.println("准备释放锁。。。2"); lock.unlock(); } } } //运行结果 /* 获取锁成功。。。1 获取锁成功。。。2 开始执行业务。。。2 准备释放锁。。。2 开始执行业务。。。1 准备释放锁。。。1 */
由于执行完成后锁已经被删除,redis内无法看到,所以我们打断点查看一下:
断点1:
断点2:
可以看到此时锁次数变为2。
断点3:
此时方法B执行完,释放了一次锁,锁的次数变为1。