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 等。除此之外,在具体使用时可能会存在网络延迟和故障等情况,需要在使用时考虑这些潜在问题。

 

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
3月前
|
监控 NoSQL 算法
Redis主从切换,锁失效怎么办?
在分布式系统中,Redis因其高性能和易用性而被广泛应用于缓存、分布式锁等场景。然而,当Redis采用主从架构以实现高可用性和数据冗余时,主从切换可能带来的锁失效问题成为了一个不容忽视的挑战。本文将深入探讨Redis主从切换导致锁失效的原因、影响及解决方案,旨在为大家提供实用的技术干货。
154 5
|
5月前
|
负载均衡 NoSQL 算法
一天五道Java面试题----第十天(简述Redis事务实现--------->负载均衡算法、类型)
这篇文章是关于Java面试中Redis相关问题的笔记,包括Redis事务实现、集群方案、主从复制原理、CAP和BASE理论以及负载均衡算法和类型。
一天五道Java面试题----第十天(简述Redis事务实现--------->负载均衡算法、类型)
|
2月前
|
存储 消息中间件 NoSQL
Redis数据结构:List类型全面解析
Redis数据结构——List类型全面解析:存储多个有序的字符串,列表中每个字符串成为元素 Eelement,最多可以存储 2^32-1 个元素。可对列表两端插入(push)和弹出(pop)、获取指定范围的元素列表等,常见命令。 底层数据结构:3.2版本之前,底层采用**压缩链表ZipList**和**双向链表LinkedList**;3.2版本之后,底层数据结构为**快速链表QuickList** 列表是一种比较灵活的数据结构,可以充当栈、队列、阻塞队列,在实际开发中有很多应用场景。
|
3月前
|
消息中间件 存储 监控
redis 的List类型 实现 排行榜
【10月更文挑战第8天】
50 2
|
3月前
|
存储 NoSQL Redis
redis-set类型
【10月更文挑战第6天】
57 1
|
3月前
|
NoSQL Java API
美团面试:Redis锁如何续期?Redis锁超时,任务没完怎么办?
在40岁老架构师尼恩的读者交流群中,近期有小伙伴在面试一线互联网企业时遇到了关于Redis分布式锁过期及自动续期的问题。尼恩对此进行了系统化的梳理,介绍了两种核心解决方案:一是通过增加版本号实现乐观锁,二是利用watch dog自动续期机制。后者通过后台线程定期检查锁的状态并在必要时延长锁的过期时间,确保锁不会因超时而意外释放。尼恩还分享了详细的代码实现和原理分析,帮助读者深入理解并掌握这些技术点,以便在面试中自信应对相关问题。更多技术细节和面试准备资料可在尼恩的技术文章和《尼恩Java面试宝典》中获取。
美团面试:Redis锁如何续期?Redis锁超时,任务没完怎么办?
|
3月前
|
存储 分布式计算 NoSQL
大数据-40 Redis 类型集合 string list set sorted hash 指令列表 执行结果 附截图
大数据-40 Redis 类型集合 string list set sorted hash 指令列表 执行结果 附截图
29 3
|
3月前
|
消息中间件 分布式计算 NoSQL
大数据-41 Redis 类型集合(2) bitmap位操作 geohash空间计算 stream持久化消息队列 Z阶曲线 Base32编码
大数据-41 Redis 类型集合(2) bitmap位操作 geohash空间计算 stream持久化消息队列 Z阶曲线 Base32编码
32 2
|
2月前
|
存储 NoSQL 关系型数据库
Redis的ZSet底层数据结构,ZSet类型全面解析
Redis的ZSet底层数据结构,ZSet类型全面解析;应用场景、底层结构、常用命令;压缩列表ZipList、跳表SkipList;B+树与跳表对比,MySQL为什么使用B+树;ZSet为什么用跳表,而不是B+树、红黑树、二叉树
|
4月前
|
JSON 缓存 NoSQL
redis序列化数据时,如何包含clsss类型信息?
通过配置 `com.fasterxml.jackson.databind.ObjectMapper` 的 `enableDefaultTyping` 方法,可以使序列化后的 JSON 包含类信息。
60 2