介绍 Redisson
什么是 Redisson?来自于官网上的描述内容如下!
Redisson 是一个在 Redis 的基础上实现的 Java 驻内存数据网格客户端(In-Memory Data Grid)。它不仅提供了一系列的 redis 常用数据结构命令服务,还提供了许多分布式服务,例如分布式锁、分布式对象、分布式集合、分布式远程服务、分布式调度任务服务等等。
相比于 Jedis、Lettuce 等基于 redis 命令封装的客户端,Redisson 提供的功能更加高端和抽象
配置 Redisson
引入依赖
|
|
配置客户端类
|
|
使用 Redisson 分布式锁
|
|
不可重入锁
在同一个线程中,method1 获取锁后,调用 method2,method2 中尝试获取锁,此时锁已经被 method1 获取,则 method2 获取锁失败,这就是不可重入锁,前面实现的锁就是不可重入锁!

Redisson 可重入锁
可重入锁,从字面来理解,就是可以重复进入的锁,也叫做递归锁,指的是同一线程外层函数获得锁之后,内层递归函数仍然有获取该锁的代码,但不受影响。
ReentrantLock 和synchronized都是可重入锁。
在一个类中,如果 synchronized 方法 1 调用了 synchronized 方法 2,方法 2 是可以正常执行的,这说明 synchronized 是可重入锁。否则,在执行方法 2 想获取锁的时候,该锁已经在执行方法 1 时获取了,那么方法 2 将永远得不到执行。
为了实现可重入锁,Redis 中使用 hash 类型不再使用 string 类型,**为什么要使用 hash 类型,**就不得不说到 Redisson 可重入锁在 redis 中的实现原理:
实现原理 :
在同一线程中,method1 成功获取锁后调用 method2,method2 也尝试获取锁,此时要先判断 method2 所在线程和 method1 所在线程是否是同一线程,若是,则 method2 也获取锁成功,它和 method1 显然获取了同一个锁**,那么该锁被获取次数+1,而这个锁被获取的次数我们需要记录,也就是说 value 不仅要记录 线程名 还要记录 锁被获取的次数,那么我们就由此采用 hash 类型更合理!**
为什么记录锁被获取的次数?
一个业务的完成可能要多次获取锁,如一个业务中执行了 method1,method1 调用了 method2,method2 调用了 method3,这三个方法都加同一个锁(可重入锁),当 method3 执行完后,并不能立刻释放 method3 的锁,而是锁被获取的次数-1 ,因为锁是共享的,此时 method1 和 method2 还没执行完不能释放锁,那么什么时候释放锁?当然是锁被获取的次数减为 0 了,说明此时已经没有方法获取锁,那么可以安全的释放可重入锁了。
So 锁被获取的次数就是我们判断是否要释放锁的依据!

