首先要了解:分布式锁需要解决的问题
1.互斥性
2.安全性
3.死锁
4.容错
方法一:
SETNX key value:如果key不存在,则创建并赋值
时间复杂度O(1),返回值:设置成功返回1 失败返回0(locknx已经存在无法更改,操作是原子的)
image.png
在执行某段代码时,先尝试使用SETNX对某个key设值,如果成功则没有其他线程占用该资源,如果失败则等待到SETNX成功。
但是如果SETNX某个key,则这个key就长久存在,如何解决SETNX长期有效的问题?
EXPIRE key seconds
设置key的生存时间,当key过期时(生存时间为0)会被自动删除
image代码逻辑(伪代码)如下:
imageEXPIRE缺点:原子性得不到满足(当setnx执行成功后挂掉,未来得及执行expire,会导致key一直被占用,其他线程永远无法执行)
方法二:
set key value [EX seconds] [PX milliseconds] [NX|XX]
image.png
EX seconds:设置键的过期时间为second秒
PX milliseconds:设置键的过期时间为 milliseconds毫秒
NX:只在键不存在时,才对键进行设置操作
XX:只在键已经存在时,才对键进行设置操作
SET操作成功完成时,返回OK,否则返回nil
如果有大量的key同时过期的时候,由于清除大量的key很耗时,会出现短暂的卡顿现象:在设置key的过期时间的时候,给每个key设置随机值来避免卡顿现象发生。
网友评论