乐趣区

关于redis:2022年Redis最新面试题第5篇-Redis集群

大家好,我是散步 coding, 最近在整顿 2022 年 Redis 最新面试题, 大家也能够通过我上面的博客地址在线浏览, 明天讲讲第 5 篇 – Redis 集群。本文首发于公众号: 散步 coding

2022 年 Redis 最新面试题目录

  • Redis 基础知识
  • Redis 数据结构
  • Redis 事务
  • Redis 数据长久化
  • Redis 集群
  • Redis 淘汰策略
  • Redis 分布式锁
  • Redis 缓存问题
  • 运维和部署

概要

  • Redis 是单过程单线程的?
  • 是否应用过 Redis 集群,集群的原理是什么?
  • 能够简略说说你对 Redis Sentinel 的了解
  • Redis Sentinal 和 Redis Cluster 的区别
  • Redis 的同步机制理解么?
  • Redis 集群最大节点个数是多少?

Redis 是单过程单线程的?

呈现概率: ★★★★

大家所熟知的 Redis 的确是单线程模型,指的是执行 Redis 命令的外围模块是单线程的,而不是整个 Redis 实例就一个线程,Redis 其余模块还有各自模块的线程的。

上面这个解释比拟好:

同时 Redis 采纳网络 I/O 多路复用技术,来保障在多连贯的时候零碎的高吞吐量。对于 I/O 多路复用 (又被称为“事件驱动”),首先要了解的是,操作系统为你提供了一个性能,当你的某个 socket 可读或者可写的时候,它能够给你一个告诉。这样当配合非阻塞的 socket 应用时,只有当零碎告诉我哪个描述符可读了,我才去执行 read 操作,能够保障每次 read 都能读到无效数据而不做纯返回 -1 和 EAGAIN 的无用功,写操作相似。

目前多路复用次要有三种技术:select,poll,epoll。epoll 是最新的也是目前最好的多路复用技术。

采纳多路 I/O 复用技术能够让单个线程高效的解决多个连贯申请 (尽量减少网络 I/O 的工夫耗费),且 Redis 在内存中操作数据的速度十分快,也就是说内存内的操作不会成为影响 Redis 性能的瓶颈,基于这两点 Redis 具备很高的吞吐量。

是否应用过 Redis 集群,集群的原理是什么?

呈现概率: ★★★

Redis Cluster 是 在 3.0 版本正式推出的高可用集群计划,相比 Redis Sentinel,Redis Cluster 计划不须要额定部署 Sentinel 集群,而是通过集群外部通信实现集群监控,故障时主从切换;同时,反对外部基于哈希实现数据分片,反对动静程度扩容。

  • Redis 集群有多个 master,能够减小拜访瞬断问题的影响;若集群中有一个 master 挂了,正好须要向这个 master 写数据,这个操作须要期待一下;然而向其余 master 节点写数据是不受影响的。
  • Redis 集群有多个 master,能够提供更高的并发量;
  • Redis 集群能够分片存储,这样就能够存储更多的数据;

将整个数据集依照肯定规定调配到多个节点上,称为数据分片,Redis Cluster 采纳的分片计划是哈希分片, 基本原理如下:Redis Cluster 首先定义了编号 0 ~ 16383 的区间,称为槽,所有的键依据哈希函数映射到 0 ~ 16383 整数槽内,计算公式:slot=CRC16(key)&16383。每一个节点负责保护一部分槽以及槽所映射的键值数据。

能够简略说说你对 Redis Sentinel 的了解

呈现概率: ★★★

Redis Sentinel 是官网从 Redis 2.6 版本提供的高可用计划,在 Redis 主从复制集群的根底上,减少 Sentinel 集群监控整个 Redis 集群。当 Redis 集群 master 节点产生故障时,Sentinel 进行故障切换,选举出新的 master,同时 Sentinel 自身反对高可用集群部署。

Redis Sentinal 和 Redis Cluster 的区别

呈现概率: ★★★

Redis Sentinal 和 Redis Cluster 的区别次要在于侧重点不同:

  • Redis Sentinal 次要聚焦于高可用,在 master 宕机时会主动将 slave 晋升为 master,持续提供服务。
  • Redis Cluster 次要聚焦于扩展性,在单个 redis 内存不足时,应用 Cluster 进行分片存储。

Redis 的同步机制理解么?

呈现概率: ★★★

主从同步。第一次同步时,主节点做一次 bgsave,并同时将后续批改操作记录到内存 buffer,待实现后将 rdb 文件全量同步到复制节点,复制节点承受实现后将 rdb 镜像加载到内存。加载实现后,再告诉主节点将期间批改的操作记录同步到复制节点进行重放就实现了同步过程。

全备份过程中,在 slave 启动时,会向其 master 发送一条 SYNC 音讯,master 收到 slave 的这条音讯之后,将可能启动后盾过程进行备份,备份实现之后就将备份的数据发送给 slave,初始时的全同步机制是这样的:

Redis 集群最大节点个数是多少?

呈现概率: ★★★

这个比拟偏,晓得的人不多,如果你能够答出最大节点数,而后给出解释, 预计面试官的好感度, 会蹭蹭的往上涨。

16384 个。这是因为 Redis 集群并没有应用一致性 hash,而是引入了哈希槽的概念。Redis 集群有 16384 个哈希槽,每个 key 通过 CRC16 校验后对 16384 取模来决定搁置哪个槽,集群的每个节点负责一部分 hash 槽。

但为什么哈希槽的数量是 16384(2^14)个呢?

在 redis 节点发送心跳包时须要把所有的槽放到这个心跳包里,以便让节点晓得以后集群信息,16384=16k,在发送心跳包时应用 char 进行 bitmap 压缩后是 2k(2 8 (8 bit) 1024(1k) = 16K),也就是说应用 2k 的空间创立了 16k 的槽数。

尽管应用 CRC16 算法最多能够调配 65535(2^16-1)个槽位,65535=65k,压缩后就是 8k(8 8 (8 bit) 1024(1k) =65K),也就是说须要须要 8k 的心跳包,Redis 作者认为这样做不太值得;并且个别状况下一个 redis 集群不会有超过 1000 个 master 节点,所以 16k 的槽位是个比拟适合的抉择。

对于 Redis 作者探讨为什么这么设计, 能够看这里。

也欢送关注我的公众号: 散步 coding。一起交换, 在 coding 的世界里散步, 回复: redis, 收费获取最新 Redis 面试题 (含答案)。

退出移动版