基于redis的setnx()、get()、getset()方法 分布式锁解读
发布日期:2021-06-29 13:13:55 浏览次数:2 分类:技术文章

本文共 1340 字,大约阅读时间需要 4 分钟。

一.redis命令讲解:

setex()命令:

SETEX key seconds value将值 value 关联到 key ,并将 key 的生存时间设为 seconds (以秒为单位)。如果 key 已经存在, SETEX 命令将覆写旧值。这个命令类似于以下两个命令:SET key valueEXPIRE key seconds  # 设置生存时间不同之处是, SETEX 是一个原子性(atomic)操作,关联值和设置生存时间两个动作会在同一时间内完成,该命令在 Redis 用作缓存时,非常实用。可用版本:>= 2.0.0时间复杂度:O(1)返回值:设置成功时返回 OK 。当 seconds 参数不合法时,返回一个错误。

 

setnx()命令:

SETNX key value将 key 的值设为 value ,当且仅当 key 不存在。若给定的 key 已经存在,则 SETNX 不做任何动作。SETNX 是『SET if Not eXists』(如果不存在,则 SET)的简写。可用版本:>= 1.0.0时间复杂度:O(1)返回值:设置成功,返回 1 。设置失败,返回 0 。

 

get()命令:

GET key返回 key 所关联的字符串值。如果 key 不存在那么返回特殊值 nil 。假如 key 储存的值不是字符串类型,返回一个错误,因为 GET 只能用于处理字符串值。可用版本:>= 1.0.0时间复杂度:O(1)返回值:当 key 不存在时,返回 nil ,否则,返回 key 的值。如果 key 不是字符串类型,那么返回一个错误。

 

getset()命令:

GETSET key value将给定 key 的值设为 value ,并返回 key 的旧值(old value)。当 key 存在但不是字符串类型时,返回一个错误。可用版本:>= 1.0.0时间复杂度:O(1)返回值:返回给定 key 的旧值。当 key 没有旧值时,也即是, key 不存在时,返回 nil 。

 

 

二.具体的使用步骤如下:

     1. setnx(lockkey, 当前时间+过期超时时间) ,如果返回1,则获取锁成功;如果返回0则没有获取到锁,转向2。

     2. get(lockkey)获取值oldExpireTime ,并将这个value值与当前的系统时间进行比较,如果小于当前系统时间,则认为这个锁已经超时,可以允许别的请求重新获取,转向3。
     3. 计算newExpireTime=当前时间+过期超时时间,然后getset(lockkey, newExpireTime) 会返回当前lockkey的值currentExpireTime。
     4. 判断currentExpireTime与oldExpireTime 是否相等,如果相等,说明当前getset设置成功,获取到了锁。如果不相等,说明这个锁又被别的请求获取走了,那么当前请求可以直接返回失败,或者继续重试。
     5. 在获取到锁之后,当前线程可以开始自己的业务处理,当处理完毕后,比较自己的处理时间和对于锁设置的超时时间,如果小于锁设置的超时时间,则直接执行delete释放锁;如果大于锁设置的超时时间,则不需要再锁进行处理。 

 

 

转载地址:https://changemax.blog.csdn.net/article/details/101697253 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:什么是SpringCloud?使用Spring Cloud有什么优势?
下一篇:Redis有效时间设置及时间过期处理

发表评论

最新留言

路过,博主的博客真漂亮。。
[***.116.15.85]2024年04月26日 10时03分34秒