Redis可实现的锁的类型

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
简介: Redis可实现的锁的类型及其详解

Redis可以实现不同类型的锁,包括:

1.     基于 SETNX 的简单锁:使用 SETNX 命令来设置一个特定的键作为锁,若该键不存在,则获取锁成功。若键已存在,表示锁已被其他进程持有,获取锁失败。通过 DEL 命令释放锁。

2.     基于 SETEX 的带超时的锁:使用 SETEX 命令来设置一个特定的键作为锁,并给锁设置过期时间。获取锁成功后,在锁过期之前完成操作,并通过 DEL 命令释放锁。这种方式避免了锁长时间占用问题。

3.     基于 Lua 脚本的原子性锁:使用 Lua 脚本结合 SETNXEVAL 等命令,将获取锁、设置过期时间和释放锁等操作合并为一个原子性操作。确保多个指令的执行在 Redis 中是原子的,防止竞态条件。

4.     基于 RedLock 算法的分布式锁:RedLock Redis 官方提供的一种分布式锁算法,通过在多个 Redis 节点上获取锁,增加锁的可靠性。通过获取大多数 Redis 节点的锁才算获取成功,确保分布式环境下的锁的有效性。


redisson提供好的锁有:      

1. 单实例锁(Single Instance Lock):使用RedisSETNX命令(SET if Not eXists)来实现。该命令在键不存在时设置键的值,如果键已经存在,则不进行任何操作。通过SETNX命令,可以在Redis中创建一个唯一的键作为锁,当某个线程成功设置了该键时,表示获取到了锁。

2. 重入锁(Reentrant Lock):通过给每个线程分配一个唯一的标识符,使用Redis的哈希表数据结构来实现。每个线程在获取锁时,将自己的标识符添加到哈希表中,释放锁时再将自己的标识符从哈希表中移除。这样可以实现线程对同一个锁的重复获取。

3. 自旋锁(Spin Lock):使用RedisINCR命令(INCRement)来实现。每个线程在获取锁时,尝试递增一个特定的键的值,如果递增结果等于1,则表示获取到了锁;否则,线程会不断循环尝试获取锁,直到成功。

4. 读写锁(Read-Write Lock):通过结合使用SETNX命令和SET命令来实现。读锁和写锁分别使用不同的键来表示,读锁可以被多个线程同时获取,而写锁只能被一个线程获取。获取读锁时,首先尝试获取写锁,如果获取失败再获取读锁;释放读锁时,如果没有其他线程持有读锁,则释放写锁。

5.公平锁(Fair Lock):基于Redis的SET命令和Lua脚本实现,保证获取锁的顺序按照请求的顺序进行排队。即先到先得,避免了线程饥饿问题。

6.联锁(MultiLock):可以同时对多个锁进行加锁或解锁操作。使用联锁可以一次性获得多个锁资源,或者在所有锁都可用时同时释放多个锁。

7.红锁(RedLock):基于Redis的RedLock算法实现的分布式锁。使用多个Redis节点来增加锁的可靠性,当大多数Redis节点成功获取锁时,认为获取锁成功。适用于高可靠性要求的分布式环境。(因太占用资源企业已淘汰)

这些锁类型可以根据具体的需求选择使用,但需要注意的是,Redis的锁并不能保证绝对的可靠性,因为Redis单机模式存在单点故障的风险,在分布式环境下可以使用 RedLock 算法或其他技术手段来增加锁的可靠性,或者考虑使用分布式锁的中间件如ZooKeeper、etcd 等。除此之外,在具体使用时可能会存在网络延迟和故障等情况,需要在使用时考虑这些潜在问题。

 

相关文章
|
13天前
|
NoSQL Java 调度
分布式锁与分布式锁使用 Redis 和 Spring Boot 进行调度锁(不带 ShedLock)
分布式锁是分布式系统中用于同步多节点访问共享资源的机制,防止并发操作带来的冲突。本文介绍了基于Spring Boot和Redis实现分布式锁的技术方案,涵盖锁的获取与释放、Redis配置、服务调度及多实例运行等内容,通过Docker Compose搭建环境,验证了锁的有效性与互斥特性。
分布式锁与分布式锁使用 Redis 和 Spring Boot 进行调度锁(不带 ShedLock)
|
11月前
|
监控 NoSQL 算法
Redis主从切换,锁失效怎么办?
在分布式系统中,Redis因其高性能和易用性而被广泛应用于缓存、分布式锁等场景。然而,当Redis采用主从架构以实现高可用性和数据冗余时,主从切换可能带来的锁失效问题成为了一个不容忽视的挑战。本文将深入探讨Redis主从切换导致锁失效的原因、影响及解决方案,旨在为大家提供实用的技术干货。
485 5
|
负载均衡 NoSQL 算法
一天五道Java面试题----第十天(简述Redis事务实现--------->负载均衡算法、类型)
这篇文章是关于Java面试中Redis相关问题的笔记,包括Redis事务实现、集群方案、主从复制原理、CAP和BASE理论以及负载均衡算法和类型。
一天五道Java面试题----第十天(简述Redis事务实现--------->负载均衡算法、类型)
|
10月前
|
存储 消息中间件 NoSQL
Redis数据结构:List类型全面解析
Redis数据结构——List类型全面解析:存储多个有序的字符串,列表中每个字符串成为元素 Eelement,最多可以存储 2^32-1 个元素。可对列表两端插入(push)和弹出(pop)、获取指定范围的元素列表等,常见命令。 底层数据结构:3.2版本之前,底层采用**压缩链表ZipList**和**双向链表LinkedList**;3.2版本之后,底层数据结构为**快速链表QuickList** 列表是一种比较灵活的数据结构,可以充当栈、队列、阻塞队列,在实际开发中有很多应用场景。
|
11月前
|
消息中间件 存储 监控
redis 的List类型 实现 排行榜
【10月更文挑战第8天】
161 2
|
11月前
|
存储 NoSQL Redis
redis-set类型
【10月更文挑战第6天】
152 1
|
11月前
|
NoSQL Java API
美团面试:Redis锁如何续期?Redis锁超时,任务没完怎么办?
在40岁老架构师尼恩的读者交流群中,近期有小伙伴在面试一线互联网企业时遇到了关于Redis分布式锁过期及自动续期的问题。尼恩对此进行了系统化的梳理,介绍了两种核心解决方案:一是通过增加版本号实现乐观锁,二是利用watch dog自动续期机制。后者通过后台线程定期检查锁的状态并在必要时延长锁的过期时间,确保锁不会因超时而意外释放。尼恩还分享了详细的代码实现和原理分析,帮助读者深入理解并掌握这些技术点,以便在面试中自信应对相关问题。更多技术细节和面试准备资料可在尼恩的技术文章和《尼恩Java面试宝典》中获取。
美团面试:Redis锁如何续期?Redis锁超时,任务没完怎么办?
|
11月前
|
存储 分布式计算 NoSQL
大数据-40 Redis 类型集合 string list set sorted hash 指令列表 执行结果 附截图
大数据-40 Redis 类型集合 string list set sorted hash 指令列表 执行结果 附截图
97 3
|
11月前
|
消息中间件 分布式计算 NoSQL
大数据-41 Redis 类型集合(2) bitmap位操作 geohash空间计算 stream持久化消息队列 Z阶曲线 Base32编码
大数据-41 Redis 类型集合(2) bitmap位操作 geohash空间计算 stream持久化消息队列 Z阶曲线 Base32编码
112 2
|
缓存 NoSQL Java
SpringBoot整合Redis、以及缓存穿透、缓存雪崩、缓存击穿的理解、如何添加锁解决缓存击穿问题?分布式情况下如何添加分布式锁
这篇文章介绍了如何在SpringBoot项目中整合Redis,并探讨了缓存穿透、缓存雪崩和缓存击穿的问题以及解决方法。文章还提供了解决缓存击穿问题的加锁示例代码,包括存在问题和问题解决后的版本,并指出了本地锁在分布式情况下的局限性,引出了分布式锁的概念。
SpringBoot整合Redis、以及缓存穿透、缓存雪崩、缓存击穿的理解、如何添加锁解决缓存击穿问题?分布式情况下如何添加分布式锁