基于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