Redis setnx是原子性操作么

yongger520 2017-04-24 11:08:32
setnx应用在分布式加锁的场景
我有个问题

如果两个客户端连接一个Redis Server
同时做setnx 会出现什么情况?

是一个成功一个失败么
...全文
3057 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
jonhy.luo 2019-07-17
  • 打赏
  • 举报
回复 2
setnx是获取锁,再操作 因为redis本身是单例队列处理的,你再多高并发请求获取锁都是排队进行,也就是只有前边第一个获取成功,后边的都获取失败。 简单实现分布式锁的过程: A\B同时在业务中setnx来申请锁(高并发下重复提交场景),A申请到锁,进行业务操作,或者入库操作,完成操作后释放锁。 这时候B会有几种情况。 1、B申请锁的时候A还没释放锁,此时B申请失败,业务逻辑处理直接返回失败 2、B申请锁时候A已经释放了锁,B获得锁,这时候一般会查询数据库/缓存,根据全局唯一ID索引来确认该操作之前是否做过,做过了直接返回失败,否则将唯一索引入库。再执行业务操作释放锁。 这样就防止了多集群/高并发情况下,重复(重试)提交造成帐脏数据情况。
loren-encoding 2017-08-04
  • 打赏
  • 举报
回复 2
我也好奇,既然说setnx是应用于分布式锁,但是当两个线程同时调用setnx那会怎么样啊?setnx源码是加锁得吗?
Java程序师傅 2021-07-07
  • 举报
回复 3
@loren-encoding setnx就是简单的,没有key,才赋值,意思是A代码加锁,B就用不了,除非A事情干完,解锁,B才能用

25,980

社区成员

发帖
与我相关
我的任务
社区描述
高性能WEB开发
社区管理员
  • 高性能WEB开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧