上一篇地址:赶紧收藏!2024 年最常见 20道 Redis面试题(五)-CSDN博客
十一、Redis集群之间是如何复制的?
Redis 集群是一个分布式系统,它由多个节点组成,这些节点共同存储数据并提供服务。在 Redis 集群中,数据被分割成多个槽(slots),每个槽由集群中的一个主节点负责。集群中的每个主节点可以有一个或多个从节点与之对应,形成主从复制关系。以下是 Redis 集群之间复制的详细过程:
1. 数据分片(槽分配)
- Redis 集群有固定数量的槽(默认为16384个),这些槽被分配给集群中的主节点。
- 每个键值对根据其键的哈希值映射到一个特定的槽中。
2. 主从复制关系
- 集群中的每个主节点可以有一个或多个从节点。
- 主节点负责处理写操作,并将数据的变更复制给其从节点。
3. 建立复制
- 当从节点启动并加入集群时,它会与一个或多个主节点建立复制关系。
- 从节点通过发送
SLAVEOF
命令来指定它要复制的主节点。
4. 数据同步
- 初次复制时,主节点执行
BGSAVE
创建一个 RDB 快照文件,并将该文件发送给从节点。 - 从节点接收 RDB 文件并加载,以获得主节点的数据副本。
- 主节点继续处理写操作,并开始使用复制偏移量记录数据变更。
5. 部分重同步(如果支持)
- 如果主从节点之间的连接断开,且断开时间不长,Redis 4.0 及更高版本支持部分重同步(streaming replication with partial resynchronization)。
- 部分重同步允许从节点请求缺少的数据段,而不是重新同步整个数据集。
6. 持续复制
- 主节点将所有写命令发送给从节点,从节点执行相同的命令以保持数据一致。
- 复制是异步的,但主节点会跟踪复制偏移量和从节点的偏移量,以确保数据一致性。
7. 故障转移
- 如果主节点发生故障,集群会通过 Sentinel 系统或手动干预来选举一个新的主节点。
- 通常,一个从节点会被提升为新的主节点,接管原主节点负责的槽。
8. 槽迁移
- 在主节点故障转移后,需要将原主节点负责的槽迁移到新的主节点。
- 集群中的其他节点会更新其槽到主节点的映射信息。
9. 客户端重定向
- 客户端在尝试访问已迁移槽的数据时,可能会收到重定向错误。
- 客户端库通常能够处理这种重定向,并自动更新集群的状态信息。
10. 数据一致性和完整性
- 集群使用多种机制来确保数据的一致性和完整性,包括心跳检测、配置纪元等。
Redis 集群的复制机制确保了数据的高可用性和容错性。通过主从复制,集群能够在主节点故障时快速恢复服务,并通过数据分片提供线性扩展能力。然而,集群的维护和管理需要仔细设计和监控,以确保系统的稳定性和效率。
十二、怎么理解Redis事务?
Redis 事务是一个功能强大的概念,它能够保证一组命令的原子性执行。在 Redis 中,事务通过 MULTI
、EXEC
、WATCH
和 DISCARD
等命令实现。以下是对 Redis 事务机制的详细解释:
事务的基本概念
在传统的关系型数据库中,事务通常保证以下四个重要的属性,统称为 ACID 属性:
- 原子性(Atomicity):事务中的所有操作要么全部完成,要么全部不完成,不会结束在中间某个点。
- 一致性(Consistency):事务必须保证数据库从一个一致的状态转移到另一个一致的状态。
- 隔离性(Isolation):并发执行的事务之间不会互相影响。
- 持久性(Durability):一旦事务提交,它对数据库的改变就是永久性的,即使系统发生故障也不会丢失。
Redis 事务也旨在提供这些属性,但具体实现和保证的方式与关系型数据库有所不同。
Redis 事务命令
MULTI
:开始一个事务。Redis 接收到MULTI
命令后,会将随后的命令放入一个队列,但不会立即执行。EXEC
:执行事务。当EXEC
命令被发送到 Redis 时,Redis 会顺序执行MULTI
之后的所有命令,然后一次性返回所有命令的执行结果。DISCARD
:取消事务。如果在执行命令队列之前,客户端决定放弃事务,可以使用DISCARD
命令来清空事务队列并结束事务。WATCH
:监视一个或多个键。如果被监视的键在WATCH
和EXEC
之间被其他客户端改变,那么事务将不会执行,并返回 Null 响应。UNWATCH
:取消所有键的监视。通常与DISCARD
一起使用,以清除之前设置的监视。
事务的工作原理
- 开始事务 :客户端发送
MULTI
命令,Redis 开始事务,命令队列启动。 - 入队命令:客户端发送的命令被依次放入队列,实际并未执行。
- 执行事务 :客户端发送
EXEC
命令,Redis 执行队列中的所有命令,并返回执行结果。 - 乐观锁 :通过
WATCH
命令,客户端可以监视一个或多个键。如果在监视之后、执行事务之前这些键的值被其他客户端改变,事务将不会执行。 - 事务失败:如果事务中某个命令因为错误而失败,Redis 会返回错误信息,但不会执行队列中的其他命令。
- 事务取消 :如果客户端决定不执行事务,可以使用
DISCARD
命令来取消事务。
Redis 事务的限制
- 单线程执行:Redis 是单线程的,这意味着它一次只能执行一个客户端的命令。事务中的命令虽然是顺序执行,但它们仍然在一个线程中。
- 弱隔离性:Redis 事务不支持事务之间的隔离级别。在执行事务的过程中,其他客户端的命令可以插入到事务的命令序列中。
- 监控机制 :
WATCH
命令提供了一种乐观锁机制,但它依赖于客户端的逻辑来处理事务失败的情况。
事务的应用场景
- 需要多个操作原子性:当一系列操作需要作为一个整体执行时,事务可以确保它们要么全部成功,要么全部失败。
- 并发控制 :通过
WATCH
命令,可以避免在高并发环境下由竞态条件导致的问题。
理解 Redis 事务时,重要的是要认识到它提供的是原子性保证,但并不完全遵循关系型数据库中的事务隔离级别。Redis 事务适用于那些需要操作原子性但可以接受在高并发环境下可能需要重试的场景。