跳到主要内容

redis

redis 知识总结

数据结构:

字符串 sds 其他数据结构是不是也都是 sds

应用场景

基本上所有涉及到高并发的场景都会使用 redis 作为缓存层,抗并发

redis 问题

可用性,

redis 集群,节点间是否满足 CAP 理论?

redis 节点间如何同步数据?

redis stream 丢数据问题?

丢数据的可能情况:主从切换会丢数据(30s),脑裂会丢数据,

现象1: 生产环境的公共存证中心里面redis丢了两笔数据,可能是redis里面主从切换导致数据丢失???实际主从没有切换 查询日志: 生产环境发送方消息发送成功(生产端 chain 服务日志成功写入)。且存在于 redis stream 中,消费方并没有消费(消费方没有消费日志)。 dtdh 服务,针对更新授权事件,前一条和后一条事件都有。就唯独没有中间的授权文件事件。

  1. 现象原因未找到?集群模式,且没有剪枝操作

    1. 未找到原因?生产环境也未复现
    2. 后来发现可能的原因是在订阅处,没有打印错误信息,导致无法排查问题。后面增加了打印日志,也未复现。
  2. redis 自动剪枝操作导致的数据丢失问题。

    1. 剪枝的时机不对,计算 stream 长度时,未判断出【 ack、pending、未消费 】的长度。导致剪枝了未消费的数据。

双脑问题?

标准的 redis 集群部署方案?

redis 集群如何动态扩缩容?

数据分片,水平扩展

客户端复杂,跨节点操作有限制

架构模式优点缺点适用场景
主从复制简单,读写分离单点故障,扩展性差中小规模,读多写少
哨兵模式自动故障转移写操作单点,扩缩容复杂中小规模,高可用要求
Cluster模式数据分片,水平扩展客户端复杂,跨节点操作有限制大规模,高并发
代理模式对客户端透明单点风险,性能损耗多语言客户端,简化客户端
云托管运维简单成本高,定制性差快速上线,无专业运维团队

Redis 高级开发工程师核心面试题(附考察侧重点)

本次面试题围绕底层原理、性能优化、高可用架构、分布式实战、问题排查五大核心维度设计,贴合高级开发工程师的技术要求,不仅考察知识点掌握,更侧重原理理解、场景落地、问题分析能力。

一、底层核心原理(考察基础深度,区分“会用”和“懂底层”)

  1. Redis 单线程模型的核心优势是什么?为什么单线程能支撑高并发?Redis 哪些操作是多线程的?
  2. Redis 哈希表的底层实现?渐进式重哈希的设计原因和实现细节?重哈希过程中如何处理读写请求?
  3. 有序集合 ZSet 的底层实现(跳表+哈希表)?为什么 Redis 选择跳表而非红黑树?跳表的插入、查询复杂度是多少?
  4. Redis 的过期键删除策略(惰性删除+定期删除)?为什么不使用定时删除?内存淘汰策略和过期删除策略的区别?volatile-lruallkeys-lru 的适用场景?
  5. Redis 持久化的 RDB 和 AOF 底层实现原理?混合持久化(RDB+AOF)的设计优势?AOF 重写的触发条件和实现过程(为什么重写不会阻塞主进程)?
  6. RDB 的 fork 操作为什么会导致 Redis 卡顿?fork 时的内存拷贝是“写时复制(COW)”,请解释其原理和对 Redis 的影响。

二、性能优化(考察实战调优能力,贴合生产环境)

  1. 生产环境中如何定义大key、热key?分别会引发哪些问题?如何发现(命令/工具)和解决大key、热key问题?
  2. Redis 慢查询分析的核心步骤?慢查询日志的slowlog-log-slower-thanslowlog-max-len参数如何合理配置?慢查询和 Redis 卡顿的关联?
  3. 导致 Redis 卡顿(延迟飙升)的常见原因有哪些?分别对应什么排查手段(命令/工具)?(如 fork 阻塞、AOF 刷盘、大key操作、内存交换等)
  4. Redis 如何做内存优化?从数据结构选型、压缩策略、过期键管理、内存碎片清理四个方面说明。
  5. Redis 管道(Pipeline)的底层原理?和普通单条命令执行的区别?Pipeline 的最佳实践(如批次大小)?为什么 Pipeline 能提升吞吐量?
  6. Redis 的批量操作(mget/mset)和 Pipeline 的区别?分别适用于什么场景?
  7. 生产环境中如何优化 Redis 的网络性能?(如 TCP 配置、禁用内核透明大页、优化连接池等)

三、高可用架构设计(考察架构设计能力,贴合高并发/高可用场景)

主从复制

  1. Redis 主从复制的全量同步增量同步的触发条件?PSYNC 命令的实现原理(runid、偏移量 offset、复制积压缓冲区)?
  2. 主从同步延迟的常见原因?生产环境中如何优化主从同步延迟?
  3. 主库宕机后,从库直接切换为主库可能会出现什么问题?如何避免?

哨兵模式(Sentinel)

  1. Redis 哨兵集群的核心作用?哨兵的领导者选举实现原理(Raft 算法)?
  2. 哨兵实现故障转移的完整步骤?故障转移过程中如何保证数据一致性?
  3. 哨兵集群为什么需要至少 3 个节点?2 个哨兵节点的部署有什么问题?
  4. 如何配置哨兵集群的参数,提升故障转移的可靠性(如 quorum、down-after-milliseconds)?

Redis Cluster 集群

  1. Redis Cluster 核心的哈希槽机制?16384 个哈希槽的设计原因?为什么不使用更大的数值?
  2. Redis Cluster 的节点间通信原理(Gossip 协议)?Gossip 协议的优势和缺点?
  3. Redis Cluster 故障转移的完整步骤?和哨兵的故障转移有什么区别?
  4. Redis Cluster 如何实现扩容/缩容?迁移哈希槽时如何保证服务不中断?
  5. Redis Cluster 支持多键操作的条件?为什么跨槽的多键操作会报错?如何解决?

架构选型

  1. 哨兵模式和 Redis Cluster 分别适用于什么业务场景?如何选择?
  2. 生产环境中,如何设计一个支撑十万级 QPS、TB 级数据、异地多活的 Redis 高可用架构?

四、分布式实战(考察分布式思维,贴合微服务/高并发业务)

分布式锁

  1. 基于 Redis 实现分布式锁的基础方案(SET NX EX)?该方案存在哪些问题?如何优化?
  2. Redis 分布式锁的原子性如何保证?为什么不建议使用 SETNX + EXPIRE 分开执行?
  3. Redlock 算法的核心设计思路?Redlock 存在哪些争议和问题?生产环境中是否推荐使用?
  4. Redisson 实现分布式锁的优化点(如看门狗机制、公平锁/非公平锁、红锁支持)?看门狗的工作原理?
  5. 分布式锁的过期时间如何合理设置?如果业务执行时间超过锁的过期时间,如何解决?

缓存核心问题

  1. 缓存穿透、缓存击穿、缓存雪崩的核心原因业务场景有什么区别?分别给出基础解决方案生产级最优解决方案
  2. 布隆过滤器解决缓存穿透的原理?布隆过滤器的误判率如何控制?如何实现布隆过滤器的动态扩容?
  3. 缓存更新的三种策略(写穿、写回、失效)?分别适用于什么场景?如何选择?
  4. Redis + MySQL 双写一致性的核心问题?生产环境中如何解决?(如延时双删、加锁、基于 Canal 同步、使用分布式事务),请对比各方案的优缺点和适用场景。
  5. 微服务架构中,多级缓存(本地缓存+Redis+CDN)的设计思路?本地缓存的选型(如 Caffeine)和注意事项(缓存一致性)?

高级特性实战

  1. Redis 的发布订阅(Pub/Sub)和 Stream 的核心区别?Stream 的设计优势(消费组、消息持久化、消息确认)?Stream 适用于什么业务场景(如消息队列、日志收集)?
  2. Redis Pipeline、事务、Lua 脚本的区别?Lua 脚本在 Redis 中的核心作用?为什么 Lua 脚本能保证操作的原子性?生产中 Lua 脚本的最佳实践?
  3. Redis 的 Geo 类型底层实现(Geohash)?Geohash 的编码原理和精度问题?如何实现附近的人、距离计算等场景?
  4. HyperLogLog 的底层原理?为什么能以极小的内存实现基数统计?误差率是多少?适用于什么场景?

五、生产问题排查与故障处理(考察问题解决能力,贴合线上实战)

  1. 生产环境中 Redis 出现连接数过多(maxclients) 的问题,如何快速排查原因?给出具体的排查命令和解决步骤?
  2. 如何排查 Redis 的内存碎片过高问题?Redis 4.0+ 的内存碎片清理机制(activedefrag)如何配置和使用?
  3. Redis 出现主从同步中断的常见原因?如何快速定位并恢复同步?
  4. 生产中 Redis 开启 AOF 后,磁盘 IO 过高的问题如何优化?
  5. Redis 出现内存交换(swap) 的原因?如何排查?如何避免 Redis 发生内存交换?
  6. 如何通过 Redis 的info 命令、latency monitor、slowlog 等工具定位性能瓶颈?请说明核心指标的含义(如 used_memory、rdb_bgsave_in_progress、latency_avg)。
  7. Redis Cluster 集群中某个主节点宕机,但是从节点没有完成故障转移,可能的原因有哪些?

六、开放性架构设计题(考察综合技术能力,贴合架构师思维)

  1. 设计一个支撑千万级用户、高并发秒杀的系统,Redis 在其中的作用是什么?如何通过 Redis 实现限流、削峰、库存扣减?需要规避哪些问题(如超卖、缓存击穿)?
  2. 在微服务架构中,Redis 的最佳实践有哪些?(如缓存设计、分布式锁、限流、分布式计数),如何避免 Redis 成为微服务的性能瓶颈?
  3. 如何设计一个可持久化、高可用、支持消息重试的轻量级消息队列(基于 Redis Stream)?需要考虑哪些核心点(如消费组管理、消息堆积、死信队列)?
  4. 当 Redis 存储的数据量达到 TB 级时,如何做水平扩容?除了 Redis Cluster,还有哪些方案?(如分片、结合云原生中间件)
  5. 对比 Redis 和 Memcached、Redisson、Pika 等中间件的优缺点?在什么场景下会选择替换 Redis?

七、Redis 与周边生态整合(考察技术栈融合能力)

  1. Redis 如何和消息队列(RocketMQ/Kafka)配合解决业务问题?(如缓存更新、异步削峰、最终一致性)
  2. 分布式追踪(SkyWalking/Pinpoint)中如何监控 Redis 的性能?需要关注哪些指标?
  3. Redis 在容器化(Docker/K8s)环境中的部署最佳实践?如何实现 Redis 的动态扩缩容、持久化数据挂载?
  4. 如何通过 Prometheus + Grafana 搭建 Redis 的监控体系?请列出核心的监控指标和告警规则。