结一下redis实现分布式锁的两种机制
自旋锁和排他锁
鉴于实现锁的方式不同,那么这里使用策略模式来组织代码
一、自旋锁
分布式锁抽象策略接口
|
自旋锁策略抽象类,使用模板方法模式构建
|
自旋锁实现子类
|
至此,自旋锁方式实现分布式锁就完成了,下面来看排他锁阻塞的方式实现
二、排他锁
在实现之前需要大家搞懂一个概念,也就是redis的事件通知:
|
搞懂概念之后,需要在redis的配置文件redis.conf中将其 notify-keyspace-events “KEA”,默认为notify-keyspace-events “”,这样才能启动redis的事件监听机制。
排它锁策略抽象类
|
排他锁实现子类
|
redis事件监听类
|
其实对比一下,两者的区别在于lock的实现方式不同,笔者为了确保代码完整性就全部贴上了。
那么给一个场景测试一下我们的代码有没有问题,请看下面的测试代码:
这里我们构建一个Lock工具类:
|
测试类:
|
测试结果:
如果想使用zookeeper实现分布式锁只需要抽象出一个策略类实现DistributedLock接口即可。