Redis中的锁SETNX详解
创作时间:
作者:
@小白创作中心
Redis中的锁SETNX详解
引用
CSDN
1.
https://blog.csdn.net/qq_51447496/article/details/138203263
Redis提供了多种方式来实现锁操作,这些操作可以帮助开发者在多线程或分布式环境中同步访问共享资源。
基本锁命令
- SETNX(Set if Not eXists):
- 命令:
SETNX key value - 功能:如果键
key不存在,则创建并设置键的值,返回1;如果键已存在,则不做任何操作,返回0。
- EXPIRE:
- 命令:
EXPIRE key seconds - 功能:为键
key设置过期时间,单位为秒。
- DEL:
- 命令:
DEL key - 功能:删除指定的键。
锁操作示例
- 尝试获取锁:
redis-cli SETNX lock_key my_value
- 如果返回
1,则表示成功获取锁;如果返回0,则锁已被其他客户端持有。
- 设置锁的过期时间(如果需要):
redis-cli EXPIRE lock_key 10
- 这将锁的过期时间设置为10秒,防止在锁被持有期间持有者崩溃。
- 释放锁:
redis-cli DEL lock_key
分布式环境下的锁
在分布式环境中,可以使用Redis的这些基本命令来实现分布式锁。以下是一些额外的考虑:
- 锁的原子性:
- 使用
SETNX命令来确保锁的原子性,避免在分布式环境中同时有多个客户端获取到锁。
- 锁的超时:
- 使用
EXPIRE命令设置锁的过期时间,以避免死锁。
- 锁的重试:
- 在获取锁失败时,可以实现重试机制。
- 锁的安全性:
- 通过合理的过期时间和重试策略来提高锁的安全性。
- 分布式锁的实现:
- 在分布式环境中,可以使用Redis的哨兵(Sentinel)或集群(Cluster)功能来保证锁的高可用性。
封装好的方法
- RedLock:
- RedLock是一种Redis分布式锁的实现,它通过尝试在多个Redis节点上获取锁来提高锁的安全性。
- 框架封装:
- 许多框架提供了对Redis锁的封装,例如:
- Spring Boot:使用
StringRedisTemplate或Lettuce客户端。 - Java:使用
Jedis或Lettuce客户端。
- 使用Lua脚本:
- 为了提高锁操作的原子性,可以使用Lua脚本来封装SETNX和EXPIRE命令。
Lua脚本示例
local key = KEYS[1]
local value = ARGV[1]
local ttl = tonumber(ARGV[2])
if redis.call("SETNX", key, value) == 1 then
redis.call("EXPIRE", key, ttl)
return 1
else
return 0
end
对比表:传统锁与Redis锁
特性 | 传统锁(如Java synchronized或java.util.concurrent) | Redis锁 |
|---|---|---|
实现 | 基于Java内置锁机制 | 基于Redis数据结构 |
适用范围 | 单个JVM内部 | 跨JVM、跨服务器 |
性能开销 | 较低 | 较高,涉及网络通信 |
可伸缩性 | 有限,受限于JVM | 高,易于扩展 |
阻塞和唤醒机制 | 由JVM线程调度管理 | 由Redis服务器和客户端库管理 |
超时机制 | 需要额外实现 | 内置超时机制 |
可重入性 | 支持 | 支持 |
公平性 | 可配置 | 可配置 |
锁信息存储 | 内存 | Redis键空间 |
分布式环境支持 | 不直接支持 | 支持 |
高可用性 | 依赖JVM稳定性 | 可以结合Redis Sentinel或Cluster实现高可用 |
锁的可视化管理 | 较难 | 通过Redis监控工具容易实现 |
Redission用法
Redission是一个在Java中使用Redis客户端的库,它提供了多种分布式锁和同步器的实现。以下是Redission的一些关键特性和用法:
可重入锁(FairLock):
RLock lock = redisson.getFairLock("lock"); lock.lock(); try { // 处理业务逻辑 } finally { lock.unlock(); }红锁(RedLock):
Redission实现了RedLock算法,提供了一种安全的分布式锁机制。RedLock redLock = new RedLock( new RedissonClientConfig("path/to/config.json")); boolean isLocked = redLock.tryLock("myLock", 10000); if (isLocked) { try { // 处理业务逻辑 } finally { redLock.unlock(); } }读写锁(ReadWriteLock):
RReadWriteLock lock = redisson.getReadWriteLock("rwLock"); RLock rLock = lock.readLock(); rLock.lock(); try { // 读操作 } finally { rLock.unlock(); }信号量(Semaphore):
RSemaphore semaphore = redisson.getSemaphore("semaphore"); boolean acquired = semaphore.tryAcquire(); // 尝试获取一个许可 if (acquired) { try { // 处理业务逻辑 } finally { semaphore.release(); // 释放许可 } }分布式环境下的用法:
在分布式环境下,Redission通过Redis服务器来实现锁和其他同步器。需要配置Redisson以连接到Redis集群或哨兵系统,以确保高可用性和故障转移。
分布式条件下的Redission用法
在分布式系统中,使用Redission可以提供以下优势:
- 跨JVM锁:Redission提供的锁是跨JVM的,可以在不同的实例和服务器之间同步。
- 高可用性:通过连接到Redis Sentinel或Cluster,Redission可以提供高可用性的锁。
- 灵活的配置:Redission允许你通过配置文件或代码来配置连接池、线程池、事件监听器等。
- 丰富的同步器:除了锁,Redission还提供了原子变量、计数器、布隆过滤器等多种同步器。
热门推荐
海军航空兵某通信站对接战场充实应急应战“工具箱”
萌宠猫咪大集合:多品种特性大揭秘,帮你找准最佳猫伴侣
从陌生人到好友:王者荣耀的社交设计解析
汽车操作系统开源共建,中国的路还有多远?
AUTOSAR系统解决方案:以车灯控制器设计为例
什么是岫玉?它是中国四大名玉之一
流浪猫一天应该吃多少猫粮?如何科学喂养流浪猫?
为什么天然芸苔素在当前农资背景下还这么火?
四川举办无偿献血及造血干细胞捐献公益跑活动
守护“生命的闯关”——2024造血干细胞捐献与移植科普宣传周正式启动
芦荟开花后的处理方法(细节决定芦荟的生长)
芦荟是喜阴还是喜阳的植物呢?
全国十大名绿茶:从历史到品鉴,一文读懂中国绿茶之美
小针刀治疗腰椎间盘脱出:10分钟缓解疼痛,让患者重获轻松
如何利用市场情绪指标进行投资决策
小香葱冬天会冻死吗?(解析小香葱在冬季的适应能力与保护方法)
汽车胎压高的处理方法是什么?怎样保持合适的汽车胎压?
希特勒自杀的时候,德军还剩下多少人?答案可能让大家瞠目结舌
穿越千年 《烽烟三国》上演更鲜活的三国
打印机管理员密码设置与重置指南
浙江:钱塘江大潮迎最佳观赏期 潮水奇妙多姿 跟着拍客“瞰”大潮
如何在股市中实现稳健的投资策略?投资策略的选择和风险管理有哪些关键因素?
【镰仓一日游攻略】好玩镰仓景点、交通地图、美食推荐、江之岛行程安排规划
智慧乡村可视化大屏,是如何助力乡村升级的呢?
怀素《效古册》:草书奇韵,艺术瑰宝
胃疼的原因有哪些怎么缓解
装修时发生安全事故业主怎么维权
ATM机是如何在存取验钞过程中扫描到冠字号的?
银行自助存取款机使用全攻略:八大注意事项助你安全便捷办理业务
这份《去黑头全攻略》,我们帮你整理好了!