《对线面试官》| 高频 Redis 面试题 pt.2

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
日志服务 SLS,月写入数据量 50GB 1个月
简介: 给大家分享一些在校招面试中常见的 Redis 面试题

在《对线面试官》| 高频 Redis 面试题(上)一文中,给大家分享了一些在校招面试中常见的 Redis 面试题

闲话少说,接着给大家分享干货!

13、你知道 Redis 哨兵架构吗?

哨兵架构是在 Redis 主从复制基础上构建的一套高可用解决方案

在 Redis 主从复制里,需要对故障切换进行人为操作,但在哨兵架构里,哨兵可以对 master 和 slave的运行状态进行监控,一旦 master 出现故障,就可以自动实现故障转移及主从切换,无需人工干预

这大大提高了 Redis 的高可用性
image-20220809094335372.png
Redis 哨兵具备的功能:

  • 监控:监控 Redis 节点的运行状态
  • 自动故障切换:一旦监控到 master 出现故障,自动进行故障切换,选举出一个新的 master
  • 节点自动发现:通过对 master 执行 info 命令,就能够获取到 master 下的 slave 节点列表;通过发布/订阅通道发送 hello 信息来发现其他哨兵节点

14、你知道 Redis cluster 架构吗?

Redis 集群是一种分布式数据库方案,集群通过分片(sharding)来进行数据管理,并提供复制和故障转移功能

一方面,它具有哨兵架构的自我故障检测以及故障切换的功能,另一方面,它将写操作分摊到了多个 master 上,提高了写的并发能力,解决了 master 单点故障问题

cluster 架构将数据划分为 16384 的 slots,每个 master 负责一部分槽位。槽位的信息存储于每个 master 中

当往 redis 里写入数据时,会根据哈希算法(CRC16(KEY)%16384)算出这个数的哈希槽来决定它放到哪一个主节点上,然后这个 master 的 slave 节点去自动同步

15、cluster 架构中 Redis 实例是如何进行通信的

在 Redis cluster 中,节点之间通过建立 TCP 连接,使用 gossip 协议来传播信息,最终实现所有节点都会知道整个集群完整的信息

gossip 协议有四种常用的消息类型:PING、PONG、MEET、FAIL

  • MEET:当需要向集群中加入新节点时,需要集群中的某个节点发送MEET消息到新节点,通知新节点加入集群。新节点收到MEET消息后,会回复PONG命令给发送者(redis5.0后 用add-node命令来添加节点)
  • PING:集群内每个节点每秒会向其他节点发送PING消息,用来检测其他节点是否正常工作,并交换彼此的状态信息。PING消息中会包括自身节点的状态数据和其他部分节点的状态数据
  • PONG:当接收到PING消息和MEET消息时,会向发送发回复PONG消息,PONG消息中包括自身节点的状态数据。节点也可以通过广播的方式发送自身的PONG消息来通知整个集群对自身状态的更新
  • FAIL:当一个节点判定另一个节点下线时,会向集群内广播一个FAIL消息,其他节点接收到FAIL消息之后,把对应节点更新为下线状态

16、哈希槽是如何映射到 Redis 上的,客户端是如何知道数据分配在哪个节点上的

  • 哈希槽是如何映射到 Redis 上的?

在cluster中,一个切片集群共有16384个哈希槽(2^14),这些哈希槽类似于数据分区,每个键值对都会根据它的key,被映射到一个hash槽中

然后该槽位再被映射到 Redis 实例上

  • 客户端如何定位数据在哪个节点上?

客户端和集群实例建立连接后,Redis 实例就会把哈希槽的分配信息发给客户端(Redis 实例还会把自己的哈希槽信息发给和它相连的其他实例,来完成分配信息的扩散)

客户端收到哈希槽信息之后,会将其缓存到本地,当请求数据时,客户端先计算 key 所对应的哈希槽,再根据哈希槽信息去找到对应的 Redis 实例
image-20220810194317646.png
17、可以在生产环境上使用 KEYS * 命令吗

要慎用,KEYS *命令会一次性读取所有键,如果生产环境上存储了大量的数据,可能会导致阻塞,线上服务会停顿,直到指令执行完毕,服务才能恢复

18、Reids 4.0 增加了混合持久化,什么是混合持久化?

在执行 Redis 重启操作时,如果采用 RDB ,有可能会丢失大量数据,如果使用 AOF,但 AOF 的性能要比 RDB 慢得多

Redis 4.0 为了解决这个问题,带来了一个新的持久化选项——混合持久化

  • 混合持久化:

    • 将 RDB 文件的内容和增量的 AOF 日志文件存在一起
    • 这里的 AOF 文件不再是全量日志文件,而是 自持久化开始到持久化结束 的这段时间发生的增量 AOF 日志,通常这部分 AOF 日志很小
    • 在 Redis 重启的时候,可以先加载 RDB 的内容,然后再重放增量 AOF 日志就可以完全替代之前的 AOF 全量文件重放,重启效率因此大幅得到提升

19、redis 内存用完了会发生什么

如果设置了最大可用内存限制,会触发 Redis 的内存回收策略,而且Redis 的写命令会返回错误信息(但能够进行读操作)

如果没有设置最大可用内存限制,会触发系统 OOM 将进程杀死

20、聊聊 redis 分布式锁

Redis 添加分布式锁即先拿 setnx 来争抢锁,抢到之后,再用 expire 给锁加一个过期时间防止锁忘记了释放

如果在 setnx 之后执行 expire 之前进程意外 crash 或者要重启维护,那么这个锁就永远得不到释放了

解决方法:同时把 setnx 和expire 合成一条指令来用,防止后续释放不了锁

21、Redis cluster 如何实现高可用

  • 故障检测

集群中每个节点都会定期向集群中的其他节点发送 ping 消息,以此检测对方是否在线

如果接受 ping 消息的节点没有在规定时间内返回pong消息,那么发送 PING 消息的节点就会将 PONG消息节点标记为疑似下线(possible fail,PFAIL)

如果集群中超过半数以上的主节点都将某个主节点 X 标记为 PFAIL,则就会将这个主节点 X 标记为下线(FAIL),并广播这条消息

  • 故障转移

当一个从节点发现自己所主节点下线时,就会开始进行故障转移

  1. 在该下线主节点的所有从节点中,选择一个做主节点
  2. 被选中的从节点会执行 SLAVE OF no one 命令,成为新的主节点
  3. 新的主节点会撤销对所有对下线主节点的槽指派,并将这些槽全部派给自己
  4. 新的主节点向集群广播一条 pong 消息,告诉其他节点自己变成了主节点
  5. 新主节点开始提供服务,故障转移完成

22、什么情况下会导致 Redis cluster 不可用了

cluster 架构下一般建议至少有三个主节点,便于哈希槽的分配

有R1、R2、R3 三个 master,三台 master 都没有 slave,如果 R2 失败了,那么整个集群就会认为缺少 5501-11000 这个范围的槽位而导致不可用

23、Redis 常见性能优化

  • 为了主从复制的速度和连接的稳定性,master 和 Slave 最好在同一个局域网中
  • 尽量避免在压力很大的 master 上增加 slave
  • 尽可能使用散列表(hashes),散列表(是说散列表里面存储的数少)使用的内存非常小,所以你应该尽可能的将你的数据模型抽象到一个散列表里面。比如你的 web 系统中有一个用户对象,不要为这个用户的名称,姓氏,邮箱,密码设置单独的key,而是应该把这个用户的所有信息存储到一张散列表里面
  • 好好利用 Hash, list, sorted set, set 等集合类型数据,因为通常情况下很多小的 Key-Value 可以用更紧凑的方式存放到一起
相关实践学习
基于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
相关文章
|
1月前
|
缓存 NoSQL 关系型数据库
大厂面试高频:如何解决Redis缓存雪崩、缓存穿透、缓存并发等5大难题
本文详解缓存雪崩、缓存穿透、缓存并发及缓存预热等问题,提供高可用解决方案,帮助你在大厂面试和实际工作中应对这些常见并发场景。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
大厂面试高频:如何解决Redis缓存雪崩、缓存穿透、缓存并发等5大难题
|
29天前
|
存储 NoSQL 算法
阿里面试:亿级 redis 排行榜,如何设计?
本文由40岁老架构师尼恩撰写,针对近期读者在一线互联网企业面试中遇到的高频面试题进行系统化梳理,如使用ZSET排序统计、亿级用户排行榜设计等。文章详细介绍了Redis的四大统计(基数统计、二值统计、排序统计、聚合统计)原理和应用场景,重点讲解了Redis有序集合(Sorted Set)的使用方法和命令,以及如何设计社交点赞系统和游戏玩家排行榜。此外,还探讨了超高并发下Redis热key分治原理、亿级用户排行榜的范围分片设计、Redis Cluster集群持久化方式等内容。文章最后提供了大量面试真题和解决方案,帮助读者提升技术实力,顺利通过面试。
|
1月前
|
存储 NoSQL 算法
面试官:Redis 大 key 多 key,你要怎么拆分?
本文介绍了在Redis中处理大key和多key的几种策略,包括将大value拆分成多个key-value对、对包含大量元素的数据结构进行分桶处理、通过Hash结构减少key数量,以及如何合理拆分大Bitmap或布隆过滤器以提高效率和减少内存占用。这些方法有助于优化Redis性能,特别是在数据量庞大的场景下。
面试官:Redis 大 key 多 key,你要怎么拆分?
|
2月前
|
NoSQL Java API
美团面试:Redis锁如何续期?Redis锁超时,任务没完怎么办?
在40岁老架构师尼恩的读者交流群中,近期有小伙伴在面试一线互联网企业时遇到了关于Redis分布式锁过期及自动续期的问题。尼恩对此进行了系统化的梳理,介绍了两种核心解决方案:一是通过增加版本号实现乐观锁,二是利用watch dog自动续期机制。后者通过后台线程定期检查锁的状态并在必要时延长锁的过期时间,确保锁不会因超时而意外释放。尼恩还分享了详细的代码实现和原理分析,帮助读者深入理解并掌握这些技术点,以便在面试中自信应对相关问题。更多技术细节和面试准备资料可在尼恩的技术文章和《尼恩Java面试宝典》中获取。
美团面试:Redis锁如何续期?Redis锁超时,任务没完怎么办?
|
1月前
|
存储 NoSQL Redis
Redis常见面试题:ZSet底层数据结构,SDS、压缩列表ZipList、跳表SkipList
String类型底层数据结构,List类型全面解析,ZSet底层数据结构;简单动态字符串SDS、压缩列表ZipList、哈希表、跳表SkipList、整数数组IntSet
|
存储 缓存 运维
史上最全Redis面试题及答案。
花了大量时间整理了这套Redis面试题 首发50题,绝无仅有,从入门到精通 从基础,高级知识点,再到集群,运维,方案… 弄明白了这些题可以说可以成为面霸了 面试官都得折服,Redis学得怎么样,都来检验下吧
史上最全Redis面试题及答案。
|
存储 NoSQL Java
史上最全Redis面试题及答案。
花了大量时间整理了这套Redis面试题 首发50题,绝无仅有,从入门到精通 从基础,高级知识点,再到集群,运维,方案… 弄明白了这些题可以说可以成为面霸了 面试官都得折服,Redis学得怎么样,都来检验下吧 1、什么是Redis? 2、...
3404 0
|
2月前
|
消息中间件 缓存 NoSQL
Redis 是一个高性能的键值对存储系统,常用于缓存、消息队列和会话管理等场景。
【10月更文挑战第4天】Redis 是一个高性能的键值对存储系统,常用于缓存、消息队列和会话管理等场景。随着数据增长,有时需要将 Redis 数据导出以进行分析、备份或迁移。本文详细介绍几种导出方法:1)使用 Redis 命令与重定向;2)利用 Redis 的 RDB 和 AOF 持久化功能;3)借助第三方工具如 `redis-dump`。每种方法均附有示例代码,帮助你轻松完成数据导出任务。无论数据量大小,总有一款适合你。
78 6
|
1月前
|
存储 缓存 NoSQL
【赵渝强老师】基于Redis的旁路缓存架构
本文介绍了引入缓存后的系统架构,通过缓存可以提升访问性能、降低网络拥堵、减轻服务负载和增强可扩展性。文中提供了相关图片和视频讲解,并讨论了数据库读写分离、分库分表等方法来减轻数据库压力。同时,文章也指出了缓存可能带来的复杂度增加、成本提高和数据一致性问题。
【赵渝强老师】基于Redis的旁路缓存架构
|
1月前
|
缓存 NoSQL Redis
Redis 缓存使用的实践
《Redis缓存最佳实践指南》涵盖缓存更新策略、缓存击穿防护、大key处理和性能优化。包括Cache Aside Pattern、Write Through、分布式锁、大key拆分和批量操作等技术,帮助你在项目中高效使用Redis缓存。
242 22
下一篇
DataWorks