redis底层原理2

该命令的含义是set if not exists,Redis是单线程的,所有的命令都是串行执行的。而且Redis的SETNX操作是原子的,即使有大量的线程同时发送SETNX命令,Redis也会一个接一个地执行这些命令。也就是说,即使有多个线程同时使用SETNX尝试获取锁,也只有一个线程能够成功。它们的SETNX命令会进入到Redis的命令队列中等待执行。当Redis执行完当前的SETNX命令后,会依次从队列中取出命令来执行。对于大量线程同时发送SETNX命令的情况,最终只有一个线程的SETNX命令能够成功设置新的value,其他线程的SETNX命令都会因为key已经存在而失败,但实际开发中我们使用Redis做分布式锁也要考虑到锁的超时问题、锁的释放问题

锁的超时问题,setnx用作锁的时候,必须要设置一个过期时间,防止这个锁无法及时释放造成死锁,且要注意setnx和expired必须是原子性的,如果不能保证原子性,那可能由于线程调度问题expired没有生效,依然会有死锁风险,过期时间设置也要结合实际线上情况,太短会出现问题


复制代码
                        无

原文链接:https://blog.csdn.net/wwwwwww31311/article/details/136678509

相关推荐
加油yx9 小时前
数据库基础
数据库
天桥下的卖艺者9 小时前
chrals.CTI函数升级版发布,增加了CTI衍生的脂肪指数提取
数据库·r语言
吴声子夜歌9 小时前
Nginx应用与运维——Nginx缓存服务应用实战(一)
运维·nginx·缓存
帷幕落秋9 小时前
Mysql多实例——一个服务器多个mysql服务
运维·数据库
帷幕落秋9 小时前
Mysql备份
运维·数据库
ShineWinsu9 小时前
对于Redis:ZSet类型的解析
数据库·c++·redis·缓存·面试·有序集合·zset
Dxy123931021610 小时前
MySQL 条件注释 vs 普通注释
数据库·mysql
做运维的阿瑞10 小时前
自连接、交叉连接与复杂 JOIN:一条问题链讲透
前端·数据库·mysql
新鲜势力呀10 小时前
PHP 定时任务系统实战:从 Cron 混乱执行到任务调度中心 + Redis队列 + 失败重试
android·java·redis
charmingmm81510 小时前
数据库和数据表的设计和命名经验
数据库