赶紧收藏!2024 年最常见 20道 Redis面试题(六)

上一篇地址:赶紧收藏!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 中,事务通过 MULTIEXECWATCHDISCARD 等命令实现。以下是对 Redis 事务机制的详细解释:

事务的基本概念

在传统的关系型数据库中,事务通常保证以下四个重要的属性,统称为 ACID 属性:

  • 原子性(Atomicity):事务中的所有操作要么全部完成,要么全部不完成,不会结束在中间某个点。
  • 一致性(Consistency):事务必须保证数据库从一个一致的状态转移到另一个一致的状态。
  • 隔离性(Isolation):并发执行的事务之间不会互相影响。
  • 持久性(Durability):一旦事务提交,它对数据库的改变就是永久性的,即使系统发生故障也不会丢失。

Redis 事务也旨在提供这些属性,但具体实现和保证的方式与关系型数据库有所不同。

Redis 事务命令

  • MULTI:开始一个事务。Redis 接收到 MULTI 命令后,会将随后的命令放入一个队列,但不会立即执行。
  • EXEC:执行事务。当 EXEC 命令被发送到 Redis 时,Redis 会顺序执行 MULTI 之后的所有命令,然后一次性返回所有命令的执行结果。
  • DISCARD:取消事务。如果在执行命令队列之前,客户端决定放弃事务,可以使用 DISCARD 命令来清空事务队列并结束事务。
  • WATCH:监视一个或多个键。如果被监视的键在 WATCHEXEC 之间被其他客户端改变,那么事务将不会执行,并返回 Null 响应。
  • UNWATCH:取消所有键的监视。通常与 DISCARD 一起使用,以清除之前设置的监视。

事务的工作原理

  1. 开始事务 :客户端发送 MULTI 命令,Redis 开始事务,命令队列启动。
  2. 入队命令:客户端发送的命令被依次放入队列,实际并未执行。
  3. 执行事务 :客户端发送 EXEC 命令,Redis 执行队列中的所有命令,并返回执行结果。
  4. 乐观锁 :通过 WATCH 命令,客户端可以监视一个或多个键。如果在监视之后、执行事务之前这些键的值被其他客户端改变,事务将不会执行。
  5. 事务失败:如果事务中某个命令因为错误而失败,Redis 会返回错误信息,但不会执行队列中的其他命令。
  6. 事务取消 :如果客户端决定不执行事务,可以使用 DISCARD 命令来取消事务。

Redis 事务的限制

  • 单线程执行:Redis 是单线程的,这意味着它一次只能执行一个客户端的命令。事务中的命令虽然是顺序执行,但它们仍然在一个线程中。
  • 弱隔离性:Redis 事务不支持事务之间的隔离级别。在执行事务的过程中,其他客户端的命令可以插入到事务的命令序列中。
  • 监控机制WATCH 命令提供了一种乐观锁机制,但它依赖于客户端的逻辑来处理事务失败的情况。

事务的应用场景

  • 需要多个操作原子性:当一系列操作需要作为一个整体执行时,事务可以确保它们要么全部成功,要么全部失败。
  • 并发控制 :通过 WATCH 命令,可以避免在高并发环境下由竞态条件导致的问题。

理解 Redis 事务时,重要的是要认识到它提供的是原子性保证,但并不完全遵循关系型数据库中的事务隔离级别。Redis 事务适用于那些需要操作原子性但可以接受在高并发环境下可能需要重试的场景。

相关推荐
Yaml429 分钟前
Spring Boot 与 Vue 共筑二手书籍交易卓越平台
java·spring boot·后端·mysql·spring·vue·二手书籍
小小小妮子~30 分钟前
Spring Boot详解:从入门到精通
java·spring boot·后端
hong16168832 分钟前
Spring Boot中实现多数据源连接和切换的方案
java·spring boot·后端
Channing Lewis36 分钟前
salesforce case可以新建一个roll up 字段,统计出这个case下的email数量吗
数据库·salesforce
aloha_7891 小时前
从零记录搭建一个干净的mybatis环境
java·笔记·spring·spring cloud·maven·mybatis·springboot
记录成长java2 小时前
ServletContext,Cookie,HttpSession的使用
java·开发语言·servlet
睡觉谁叫~~~2 小时前
一文解秘Rust如何与Java互操作
java·开发语言·后端·rust
毕业设计制作和分享2 小时前
ssm《数据库系统原理》课程平台的设计与实现+vue
前端·数据库·vue.js·oracle·mybatis
ketil272 小时前
Redis - String 字符串
数据库·redis·缓存
程序媛小果2 小时前
基于java+SpringBoot+Vue的旅游管理系统设计与实现
java·vue.js·spring boot