今天爱分享给大家带来Redis分布式锁 是怎么回事?【最新详细解答】,希望能够帮助到大家。
先拿setnx来争抢锁,抢到之后,再用expire给锁加一个过期时间防止锁忘记了释放。
但是在setnx之后执行expire之前进程意外crash或者要重启维护了,会造成锁永远得不到释放了。
原因:
Redis的setnx命令是当key不存在时设置key,但setnx不能同时完成expire设置失效时长,不能保证setnx和expire的原子性。
解决办法:
使用set命令完成setnx和expire的操作,保证操作是原子性的
从 Redis 2.6.12 版本开始,set指令有非常复杂的参数,可以同时把setnx和expire合成一条指令来用
set key value [EX seconds] [PX milliseconds] [NX|XX] EX seconds:设置失效时长,单位秒 PX milliseconds:设置失效时长,单位毫秒 NX:key不存在时设置value,成功返回OK,失败返回(nil) XX:key存在时设置value,成功返回OK,失败返回(nil)