简介缓存服务中的锁
1 简介
在使用缓存服务时,如果数据仅存在于内存中,宕机或重启数据将全部失效,这将会造成数据可靠性问题。
如果不支持事务,则存在数据一致性问题。比如memoryCache。
本文继续讨论缓存服务设计时如何保障数据可靠性和锁的使用如何在其中发挥作用的。它们如何将数据同步存储在磁盘提供高可靠性的,同时对应有关联的多个查询redis是否使用锁的机制实现事务保证数据完整性。
2 事务和红锁的支持
redis的事务和分布式红锁。Redis 的数据同步与高可靠性,Redis 提供两种主要的方式将内存数据同步到磁盘以确保高可靠性:RDB 快照 和 AOF(Append-Only File)日志。
3. 数据快照RDB(Redis Database Backup)
RDB 通过定期创建数据库的快照,将内存中的数据以二进制文件的形式写入磁盘。
原理:
Redis 使用 SAVE 或 BGSAVE 命令触发 RDB 生成。
BGSAVE:在后台 fork 一个子进程完成快照,而主进程继续处理请求。
RDB 文件是压缩的二进制文件,体积小,易于备份和恢复。
优点:
性能较高,快照生成时对主进程影响较小。
文件小,适合冷备份。
缺点:
数据一致性问题:发生故障时可能丢失最后一次快照后的数据。
快照生成频繁会带来性能开销。
4 缓存日志AOF(Append-Only File)
AOF 记录每个写操作,以日志的形式追加存储到文件中。
原理:
每次执行写操作,Redis 将该操作以文本形式记录到 AOF 文件。
Redis 提供三种同步策略:
always:每次写操作立即同步到磁盘(性能低,可靠性最高)。
everysec(默认):每秒同步一次(性能与可靠性折中)。
no:由操作系统决定同步时间(性能高,但可靠性低)。
AOF 文件过大时,Redis 会触发 AOF 重写,压缩日志文件。
优点:
数据恢复能力强:日志记录所有写操作,可恢复到最近的状态。
可读性好:AOF 文件是文本格式,便于分析。
缺点:
文件体积大于 RDB,持久化开销较高。
性能可能受同步策略影响。
5 混合模式
Redis 4.0 引入 RDB + AOF 混合模式,在重写 AOF 文件时,将 RDB 数据作为初始状态写入,随后追加增量操作日志。
优势:结合了 RDB 的快速恢复与 AOF 的高可靠性。
Redis 是否使用锁机制保证事务完整性?
Redis 支持事务,但它的事务机制与传统数据库不同,遵循以下特点:
- Redis 的事务
Redis 使用 MULTI 和 EXEC 命令实现事务功能:
事务的核心:
MULTI 开启事务。
事务内的命令会按顺序进入命令队列。
EXEC 执行队列中的所有命令。
如果执行失败,Redis 不会回滚,失败的命令直接报错。
原子性:Redis 保证事务内的命令在 EXEC 时按顺序执行,但不提供单个事务的部分回滚。
锁机制:Redis 的单线程模型确保了操作之间的顺序性,无需加锁。
- 事务中的多个查询是否加锁
单线程模型:Redis 内部的事件循环是单线程处理的,所有客户端请求按顺序执行,避免了数据竞争。
事务期间一致性:Redis 不会中途被其他操作打断,因此可以认为事务内的命令是逻辑上的原子操作。
红锁与事务的锁的区别
Redis 事务(MULTI/EXEC)本身没有显式的锁机制,主要依靠 Redis 单线程的特性保证命令顺序执行。事务中的每条命令独立执行,没有回滚机制。如果某条命令失败,不会影响其他命令的执行。
单机模式下无需显式加锁。
事务执行期间,其他客户端请求在队列中排队,保证顺序性。
不提供分布式环境下的锁定能力。
6 Redis 红锁
红锁(Redlock) 是 Redis 提供的一种分布式锁实现,适用于多个 Redis 实例组成的分布式环境,用于在多个客户端之间协同控制资源的访问。
实现原理:
客户端在多个独立 Redis 实例(建议为奇数个)上尝试获取锁。
如果在大多数实例(如 3/5 个)上成功获取锁,并且总耗时低于锁的有效期,则认为锁获取成功。
客户端执行任务,完成后释放锁。
锁由 Redis 的 SET key value NX PX timeout 命令实现:
NX:确保锁的唯一性(键不存在时设置)。
PX timeout:设置锁的过期时间,防止死锁。
特点:
分布式场景:适合多节点 Redis 环境,支持高可用和故障恢复。
抗故障能力:利用多实例冗余避免单点失败。
需要时间同步:要求各节点时间偏差较小,否则可能导致锁的有效期失效。
7 总结
Redis 通过 RDB 和 AOF 提供高可靠性数据存储。RDB 适合快速恢复,AOF 提供更好的数据一致性保障,混合模式结合了两者的优点。
Redis 事务使用单线程模型,不需要锁机制,事务保证命令的顺序执行,但没有传统数据库的回滚功能。
红锁是 Redis 提供的分布式锁,用于分布式场景,和 Redis 事务的实现目标和使用场景完全不同,适合控制分布式资源的并发访问。
特性 事务锁 红锁
适用场景 单机 Redis,保证命令顺序执行 分布式环境下控制资源访问
实现机制 单线程顺序执行,无需显式加锁 基于多实例协调的分布式锁
锁粒度 逻辑上的事务队列 资源级锁
回滚支持 不支持,部分失败不会回滚 不涉及事务语义,仅控制资源访问
可靠性 依赖单机 Redis 高可用,抗节点故障
- 点赞
- 收藏
- 关注作者
评论(0)