基于Redis
| 方式 |
介绍 |
原理、机制、步骤 |
失效情况 |
缺点 |
| Set NX PX |
基本操作 |
命令: |
|
|
| set key value NX PX 毫秒数 |
仅在redis单机模式下有效 |
|
|
|
| 集群模式下,会失效 |
|
|
|
|
|
|
|
|
|
| lua脚本 |
进阶操作 |
|
仅在redis单机模式下有效 |
|
| 哨兵/集群模式下,会失效 |
|
|
|
|
| 原因是因为会有主从异步,异步传播的问题 |
|
|
|
|
| 可能主节点刚写入,还未同步到从节点,主节点就宕机了,此时其他线程也可能加锁成功 |
哨兵/集群模式下,会失效 |
|
|
|
| RedLock |
分布式加锁思想 |
1、用相同的key 和随机的value进行加锁 |
|
|
| 2、设置较短的过期时间 |
|
|
|
|
| 3、使用时需要计算各个机器上加锁的耗时 |
|
|
|
|
| 4、半数以上成功,且超时时间未到,才算加上成功 |
|
|
|
|
| 5、否则,认为加锁失败,逐个进行解锁缩放 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| Redission |
分布式锁框架中间件 |
|
|
|
| 大量使用lua脚本 |
加锁过程 |
|
|
|
| 先用exits判断是否已经加锁成功 |
|
|
|
|
| 可重入锁:若成功,则使用使用hincby,加锁次数+1 |
|
|
|
|
| 使用pexpire:设置过期时间 |
|
|
|
|
| 自动延长锁过期时间(watchdog机制)(本质是定时任务) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
基于Zookeeper
参考:
1、https://blog.51cto.com/zhangxueliang/6315986