深度剖析Redisson分布式锁项目实战
今天在练手项目中也是遇到了许多新的技术,其中我认为最深刻的还是Redisson分布式锁,这里我就结合一下我项目中用到Redisson分布式锁的代码来讲述一下Redisson分布式锁,希望可以帮助大家更深刻地理解这项技术。
在之前的文章中我已经讲过Redisson分布式锁的概念,这次我就结合项目代码深入讲述
首先给出项目代码:
(从第一个注解就能看出来好久不用,我连Aop面向切面编程都遗忘了😂)
首先,这个@MyLock注解是标记在需要加入分布式锁的方法上面,当一个线程需要执行这个方法时会被注解拦截进入切面类执行tryLock方法。
在这个tryLock方法中首先会调用锁工厂(lockFactory)创建锁对象,根据lockType和name,锁工厂可以找到你需要一个什么样的锁,从而生成一个RLock对象,而这里也是我认为的一个重难点,接下来的话要认真感受:这里的getLock方法中用lockHandlers通过locktype从锁工厂(MyLockFactory)中得到了创建这一类型锁的方式,再通过apply(name)方法传入name参数从而创建了新的RLock对象,重中之重来了,这个RLock对象实际只是锁的代理对象
而这个锁的代理对象,知道自己的name,明确自己的type,也具备与Redis通信的能力,但是在此时的Redis中,并没有我们业务类中要用到的锁的键和值!!!
于是就有了第二步lock.tryLock(),这一步操作才是在连接Redis尝试获取业务类中需要的锁
在这一步操作中,会根据name在Redis中查找是否存在键为name字段的数据,如果存在,则说明锁被占用,当前线程会进入等待,如果不存在,则会创建一个键为name字段,值为Hash结构的数据,并返回true。
因为返回值为true,线程会进入try{}代码块中执行业务方法