高可用的获取锁与释放锁
高性能的获取锁与释放锁
具备可重入特性
具备锁失效机制,防止死锁
具备非阻塞锁特性
分布式锁的实现
Zookeeper
Redis
Memcached
Chubby
Redis...分布式锁的实现
分布式锁实现的三个核心要素:加锁,解锁,锁超时
Redis是单线程的
加锁
使用setnx命令
key是锁的唯一标识,按业务来决定命名
value可以设置成任意值
当一个线程执行setnx...返回1,说明key原本不存在,该线程成功得到锁.当一个线程执行setnx返回0,说明key已经存在,该线程抢锁失败
解锁
当得到锁的线程执行完任务,需要释放锁,以便其它线程可以进入,使用del指令释放锁之后...,会在一定时间后自动释放.setnx不支持超时参数,需要额外的指令expire
----
Redis分布式锁问题:
非原子性操作:
解决方案: 通过使用set命令set(key,value,expire...) 设置为原子操作
误删锁:
在设置锁超时的情况下,操作没有完成,当操作完成时,del命令删除的是其它进程的锁
解决方案: 判断是否为本进程的锁.带着key和value=threadID线程ID判断是否为本进程的锁