redis
redis 知识总结
数据结构:
字符串 sds 其他数据结构是不是也都是 sds
应用场景
基本上所有涉及到高并发的场景都会使用 redis 作为缓存层,抗并发
redis 问题
可用性,
redis 集群,节点间是否满足 CAP 理论?
redis 节点间如何同步数据?
redis stream 丢数据问题?
丢数据的可能情况:主从切换会丢数据(30s),脑裂会丢数据,
现象1: 生产环境的公共存证中心里面redis丢了两笔数据,可能是redis里面主从切换导致数据丢失???实际主从没有切换 查询日志: 生产环境发送方消息发送成功(生产端 chain 服务日志成功写入)。且存在于 redis stream 中,消费方并没有消费(消费方没有消费日志)。 dtdh 服务,针对更新授权事件,前一条和后一条事件都有。就唯独没有中间的授权文件事件。
-
现象原因未找到?集群模式,且没有剪枝操作
- 未找到原因?生产环境也未复现
- 后来发现可能的原因是在订阅处,没有打印错误信息,导致无法排查问题。后面增加了打印日志,也未复现。
-
redis 自动剪枝操作导致的数据丢失问题。
- 剪枝的时机不对,计算 stream 长度时,未判断出【 ack、pending、未消费 】的长度。导致剪枝了未消费的数据。
双脑问题?
标准的 redis 集群部署方案?
redis 集群如何动态扩缩容?
数据分片,水平扩展
客户端复杂,跨节点操作有限制
| 架构模式 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| 主从复制 | 简单,读写分离 | 单点故障,扩展性差 | 中小规模,读多写少 |
| 哨兵模式 | 自动故障转移 | 写操作单点,扩缩容复杂 | 中小规模,高可用要求 |
| Cluster模式 | 数据分片,水平扩展 | 客户端复杂,跨节点操作有限制 | 大规模,高并发 |
| 代理模式 | 对客户端透明 | 单点风险,性能损耗 | 多语言客户端,简化客户端 |
| 云托管 | 运维简单 | 成本高,定制性差 | 快速上线,无专业运维团队 |
Redis 高级开发工程师核心面试题(附考察侧重点)
本次面试题围绕底层原理、性能优化、高可用架构、分布式实战、问题排查五大核心维度设计,贴合高级开发工程师的技术要求,不仅考察知识点掌握,更侧重原理理解、场景落地、问题分析能力。
一、底层核心原理(考察基础深度,区分“会用”和“懂底层”)
- Redis 单线程模型的核心优势是什么?为什么单线程能支撑高并发?Redis 哪些操作是多线程的?
- Redis 哈希表的底层实现?渐进式重哈希的设计原因和实现细节?重哈希过程中如何处理读写请求?
- 有序集合 ZSet 的底层实现(跳表+哈希表)?为什么 Redis 选择跳表而非红黑树?跳表的插入、查询复杂度是多少?
- Redis 的过期键删除策略(惰性删除+定期删除)?为什么不使用定时删除?内存淘汰策略和过期删除策略的区别?volatile-lru 和 allkeys-lru 的适用场景?
- Redis 持久化的 RDB 和 AOF 底层实现原理?混合持久化(RDB+AOF)的设计优势?AOF 重写的触发条件和实现过程(为什么重写不会阻塞主进程)?
- RDB 的 fork 操作为什么会导致 Redis 卡顿?fork 时的内存拷贝是“写时复制(COW)”,请解释其原理和对 Redis 的影响。
二、性能优化(考察实战调优能力,贴合生产环境)
- 生产环境中如何定义大key、热key?分别会引发哪些问题?如何发现(命令/工具)和解决大key、热key问题?
- Redis 慢查询分析的核心步骤?慢查询日志的slowlog-log-slower-than和slowlog-max-len参数如何合理配置?慢查询和 Redis 卡顿的关联?
- 导致 Redis 卡顿(延迟飙升)的常见原因有哪些?分别对应什么排查手段(命令/工具)?(如 fork 阻塞、AOF 刷盘、大key操作、内存交换等)
- Redis 如何做内存优化?从数据结构选型、压缩策略、过期键管理、内存碎片清理四个方面说明。
- Redis 管道(Pipeline)的底层原理?和普通单条命令执行的区别?Pipeline 的最佳实践(如批次大小)?为什么 Pipeline 能提升吞吐量?
- Redis 的批量操作(mget/mset)和 Pipeline 的区别?分别适用于什么场景?
- 生产环境中如何优化 Redis 的网络性能?(如 TCP 配置、禁用内核透明大页、优化连接池等)
三、高可用架构设计(考察架构设计能力,贴合高并发/高可用场景)
主从复制
- Redis 主从复制的全量同步和增量同步的触发条件?PSYNC 命令的实现原理(runid、偏移量 offset、复制积压缓冲区)?
- 主从同步延迟的常见原因?生产环境中如何优化主从同步延迟?
- 主库宕机后,从库直接切换为主库可能会出现什么问题?如何避免?
哨兵模式(Sentinel)
- Redis 哨兵集群的核心作用?哨兵的领导者选举实现原理(Raft 算法)?
- 哨兵实现故障转移的完整步骤?故障转移过程中如何保证数据一致性?
- 哨兵集群为什么需要至少 3 个节点?2 个哨兵节点的部署有什么问题?
- 如何配置哨兵集群的参数,提升故障转移的可靠性(如 quorum、down-after-milliseconds)?
Redis Cluster 集群
- Redis Cluster 核心的哈希槽机制?16384 个哈希槽的设计原因?为什么不使用更大的数值?
- Redis Cluster 的节点间通信原理(Gossip 协议)?Gossip 协议的优势和缺点?
- Redis Cluster 故障转移的完整步骤?和哨兵的故障转移有什么区别?
- Redis Cluster 如何实现扩容/缩容?迁移哈希槽时如何保证服务不中断?
- Redis Cluster 支持多键操作的条件?为什么跨槽的多键操作会报错?如何解决?
架构选型
- 哨兵模式和 Redis Cluster 分别适用于什么业务场景?如何选择?
- 生产环境中,如何设计一个支撑十万级 QPS、TB 级数据、异地多活的 Redis 高可用架构?
四、分布式实战(考察分布式思维,贴合微服务/高并发业务)
分布式锁
- 基于 Redis 实现分布式锁的基础方案(SET NX EX)?该方案存在哪些问题?如何优化?
- Redis 分布式锁的原子性如何保证?为什么不建议使用 SETNX + EXPIRE 分开执行?
- Redlock 算法的核心设计思路?Redlock 存在哪些争议和问题?生产环境中是否推荐使用?
- Redisson 实现分布式锁的优化点(如看门狗机制、公平锁/非公平锁、红锁支持)?看门狗的工作原理?
- 分布式锁的过期时间如何合理设置?如果业务执行时间超过锁的过期时间,如何解决?
缓存核心问题
- 缓存穿透、缓存击穿、缓存雪崩的核心原因和业务场景有什么区别?分别给出基础解决方案和生产级最优解决方案?
- 布隆过滤器解决缓存穿透的原理?布隆过滤器的误判率如何控制?如何实现布隆过滤器的动态扩容?
- 缓存更新的三种策略(写穿、写回、失效)?分别适用于什么场景?如何选择?
- Redis + MySQL 双写一致性的核心问题?生产环境中如何解决?(如延时双删、加锁、基于 Canal 同步、使用分布式事务),请对比各方案的优缺点和适用场景。
- 微服务架构中,多级缓存(本地缓存+Redis+CDN)的设计思路?本地缓存的选型(如 Caffeine)和注意事项(缓存一致性)?
高级特性实战
- Redis 的发布订阅(Pub/Sub)和 Stream 的核心区别?Stream 的设计优势(消费组、消息持久化、消息确认)?Stream 适用于什么业务场景(如消息队列、日志收集)?
- Redis Pipeline、事务、Lua 脚本的区别?Lua 脚本在 Redis 中的核心作用?为什么 Lua 脚本能保证操作的原子性?生产中 Lua 脚本的最佳实践?
- Redis 的 Geo 类型底层实现(Geohash)?Geohash 的编码原理和精度问题?如何实现附近的人、距离计算等场景?
- HyperLogLog 的底层原理?为什么能以极小的内存实现基数统计?误差率是多少?适用于什么场景?
五、生产问题排查与故障处理(考察问题解决能力,贴合线上实战)
- 生产环境中 Redis 出现连接数过多(maxclients) 的问题,如何快速排查原因?给出具体的排查命令和解决步骤?
- 如何排查 Redis 的内存碎片过高问题?Redis 4.0+ 的内存碎片清理机制(activedefrag)如何配置和使用?
- Redis 出现主从同步中断的常见原因?如何快速定位并恢复同步?
- 生产中 Redis 开启 AOF 后,磁盘 IO 过高的问题如何优化?
- Redis 出现内存交换(swap) 的原因?如何排查?如何避免 Redis 发生内存交换?
- 如何通过 Redis 的info 命令、latency monitor、slowlog 等工具定位性能瓶颈?请说明核心指标的含义(如 used_memory、rdb_bgsave_in_progress、latency_avg)。
- Redis Cluster 集群中某个主节点宕机,但是从节点没有完成故障转移,可能的原因有哪些?
六、开放性架构设计题(考察综合技术能力,贴合架构师思维)
- 设计一个支撑千万级用户、高并发秒杀的系统,Redis 在其中的作用是什么?如何通过 Redis 实现限流、削峰、库存扣减?需要规避哪些问题(如超卖、缓存击穿)?
- 在微服务架构中,Redis 的最佳实践有哪些?(如缓存设计、分布式锁、限流、分布式计数),如何避免 Redis 成为微服务的性能瓶颈?
- 如何设计一个可持久化、高可用、支持消息重试的轻量级消息队列(基于 Redis Stream)?需要考虑哪些核心点(如消费组管理、消息堆积、死信队列)?
- 当 Redis 存储的数据量达到 TB 级时,如何做水平扩容?除了 Redis Cluster,还有哪些方案?(如分片、结合云原生中间件)
- 对比 Redis 和 Memcached、Redisson、Pika 等中间件的优缺点?在什么场景下会选择替换 Redis?
七、Redis 与周边生态整合(考察技术栈融合能力)
- Redis 如何和消息队列(RocketMQ/Kafka)配合解决业务问题?(如缓存更新、异步削峰、最终一致性)
- 分布式追踪(SkyWalking/Pinpoint)中如何监控 Redis 的性能?需要关注哪些指标?
- Redis 在容器化(Docker/K8s)环境中的部署最佳实践?如何实现 Redis 的动态扩缩容、持久化数据挂载?
- 如何通过 Prometheus + Grafana 搭建 Redis 的监控体系?请列出核心的监控指标和告警规则。