1.Redis分布式锁

2019-05-05  本文已影响0人  未知的证明

首先要了解:分布式锁需要解决的问题

1.互斥性
2.安全性
3.死锁
4.容错

方法一:

SETNX key value:如果key不存在,则创建并赋值
时间复杂度O(1),返回值:设置成功返回1 失败返回0(locknx已经存在无法更改,操作是原子的)

image
image.png

在执行某段代码时,先尝试使用SETNX对某个key设值,如果成功则没有其他线程占用该资源,如果失败则等待到SETNX成功。

但是如果SETNX某个key,则这个key就长久存在,如何解决SETNX长期有效的问题?

EXPIRE key seconds

设置key的生存时间,当key过期时(生存时间为0)会被自动删除

image

代码逻辑(伪代码)如下:

image

EXPIRE缺点:原子性得不到满足(当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设置随机值来避免卡顿现象发生。

上一篇下一篇

猜你喜欢

热点阅读