更多博客请见 我的语雀知识库


set nx命令设置锁, key是锁名,value是自定义结构。
set成功会返回1,没有成功会返回0.单线程执行使得争夺锁的那些进程具有了互斥性

一个进程持有锁之后,如果它挂了,那么这把锁不是永远都无法释放了吗?

最简单的方式可以给锁设置一个过期时间

如果进程在执行一个耗时比较久的任务,任务还没执行锁就过期了,其它实例获取了锁,然后该进程执行完毕后试图释放锁,却发现锁不在自己这就会有一些问题了,怎么办?

set nx时,将value设置为该进程的进程id。 再使用lua脚本:EVAL "if redis.call('get', KEYS[1]) == ARGV[1] then return redis.call('del', KEYS[1]) else return 0 end" 1 keyName clientID
判断锁的所有者是否与传入的客户端 ID 匹配。如果匹配,则删除锁并返回 1;如果不匹配,则返回 0。

然后java里面有一个封装后的redis包叫redission。它里面封装了一个看门狗的机制,每隔30秒检查一次看看这个任务有没有结束,没结束就给延长锁的过期时间,保证在执行期间只有这么一个进程可以获取锁。