redis底层原理

该命令的含义是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

相关推荐
duration~10 分钟前
PostgreSQL并发控制
数据库·postgresql
给力学长34 分钟前
自习室预约小程序的设计与实现
java·数据库·vue.js·elementui·小程序·uni-app·node.js
迷茫运维路2 小时前
MySQL5.7主从延迟高排查优化思路
数据库·主从延时高
菜鸟学Python2 小时前
Python web框架王者 Django 5.0发布:20周年了!
前端·数据库·python·django·sqlite
小云数据库服务专线2 小时前
GaussDB 查看会话连接数
数据库·gaussdb
墨迹的陌离4 小时前
【Linux】重生之从零开始学习运维之Mysql
linux·运维·服务器·数据库·学习·mysql
BigBigHang5 小时前
【docker】DM8达梦数据库的docker-compose以及一些启动踩坑
数据库·docker·容器
m0_720245015 小时前
QT(四)基本组件
数据库·qt·microsoft
Databend6 小时前
使用 Databend Cloud 归档 OceanBase 数据数据库
数据库
fei飛fei飞6 小时前
数据库事务中的陷阱:脏读、幻读与不可重复读
数据库