一. Redis实现分布式锁
-
加锁
虽然可以使用setnx(key,1),当一个线程执行setnx返回1,说明key原本不存在,该线程成功得到了锁;当一个线程执行setnx返回0,说明key已经存在,该线程抢锁失败。
但这样就导致锁就没有过期时间,别的线程再也无法获得锁。
所以可以采用set(key,1,30,NX)
-
解锁
虽然可以使用del(key)来解锁,但会存在误删情况。即一个已获得锁的线程A在设定的有效时间内未执行完毕就自动释放锁,此时另外一个线程B得到了锁,在线程A执行完任务,线程B还未执行完任务的情况下,执行del(key)时,删除的是B线程的锁,过可采用Lua脚本
来实现解锁。 -
锁超时
对于解锁时提出的情况,可以让获得锁的线程开启一个守护线程,用expire指令
来增加即将过期但还未执行完毕的线程锁的时间。