setnx命令学习

转自:https://segmentfault.com/a/1190000039670844,https://bbs.csdn.net/topics/392160228,https://cloud.tencent.com/developer/article/1775715

1.介绍

SETNX key value
  • 只在键 key 不存在的情况下, 将键 key 的值设置为 value 。
  • 若键 key 已经存在, 则 SETNX 命令不做任何动作。
  • SETNX 是『SET if Not eXists』(如果不存在,则 SET)的简写。

例子:

redis> EXISTS job                # job 不存在
(integer) 0

redis> SETNX job "programmer"    # job 设置成功
(integer) 1

redis> SETNX job "code-farmer"   # 尝试覆盖 job ,失败
(integer) 0

redis> GET job                   # 没有被覆盖
"programmer"

setnx本身是一个原子操作,可以保证多个线程只有一个能拿到锁,能返回true,其他的都会返回false

setnx是获取锁,再操作。因为redis本身是单例队列处理的,再多高并发请求获取锁都是排队进行,也就是只有前边第一个获取成功,后边的都获取失败。 

简单实现分布式锁的过程:

A\B同时在业务中setnx来申请锁(高并发下重复提交场景),A申请到锁,进行业务操作,或者入库操作,完成操作后释放锁。这时候B会有几种情况:

  1.  B申请锁的时候A还没释放锁,此时B申请失败,业务逻辑处理直接返回失败
  2. B申请锁时候A已经释放了锁,B获得锁,这时候一般会查询数据库/缓存,根据全局唯一ID索引来确认该操作之前是否做过,做过了直接返回失败,否则将唯一索引入库。再执行业务操作释放锁。 

 

posted @ 2022-12-17 00:46  lypbendlf  阅读(1596)  评论(0编辑  收藏  举报