Redis面试题 02
目录第一部分内存管理与性能优化 (Q1-Q3)1. Redis 的内存用完了会怎样2. Redis 如何做内存优化3. KEYS 命令存在的问题第二部分事务机制 (Q4-Q6)4. Redis 事务是什么5. Redis 事务支持隔离性吗6. Redis 事务保证原子性吗支持回滚吗第三部分持久化与选型 (Q7-Q8)7. 持久化机制有哪些8. RDB 和 AOF 如何选择第四部分高可用架构 (Q9-Q12)9. Redis 有哪些部署方案10. 主从架构原理11. 哨兵 Sentinel 机制12. Redis Cluster 集群原理 面试加分技巧串联回答这份清单涵盖了 Redis 从底层原理、内存管理、事务机制到高可用架构的全方位知识点非常适合作为面试前的突击复习或系统性梳理。以下是针对这 12 个问题的高分回答话术整理按逻辑模块分类方便记忆和表达。第一部分内存管理与性能优化 (Q1-Q3)1. Redis 的内存用完了会怎样核心回答“当 Redis 内存达到maxmemory限制时行为取决于配置的淘汰策略 (maxmemory-policy)默认情况noevictionRedis 会拒绝写入操作如 SET, LPUSH返回错误信息但读操作不受影响。这通常用于缓存要求严格一致性的场景。开启淘汰策略如果配置了其他策略如allkeys-lru,volatile-ttlRedis 会根据规则自动删除部分 Key腾出空间给新数据写入。极端情况如果没有设置maxmemory且物理内存耗尽会导致操作系统触发OOM Killer杀死 Redis 进程或者导致系统 Swap 交换性能急剧下降。”2. Redis 如何做内存优化核心回答“主要从数据结构选择和配置优化两个维度入手使用特殊编码利用 Redis 的内部优化机制。例如小哈希表使用ZipList/Listpack而非 HashMap小整数使用IntSet短字符串使用SDS 共享。这些结构比标准结构更省内存。控制 Key/Value 大小避免 BigKey大键。大 Key 不仅占用内存多还会导致网络阻塞和主从同步延迟。可以通过拆分大 Hash/List 来解决。设置过期时间对临时数据设置 TTL让 Redis 自动清理。合理配置淘汰策略根据业务场景选择合适的maxmemory-policy如纯缓存场景选allkeys-lru。32 位 vs 64 位在内存小于 4GB 的场景下使用 32 位 Redis 实例可以利用更小的指针4 字节 vs 8 字节节省约 30%-40% 的内存开销。”3.KEYS命令存在的问题核心回答KEYS命令是生产环境的禁忌。原因Redis 是单线程模型KEYS pattern需要遍历整个键空间时间复杂度是O(N)。如果数据库中有几百万个 Key执行该命令会阻塞主线程数秒甚至更久导致期间所有客户端请求无法响应引发线上事故。替代方案使用SCAN命令。SCAN基于游标迭代每次只返回少量结果不会长时间阻塞主线程适合在生产环境中渐进式地遍历 Key。”第二部分事务机制 (Q4-Q6)4. Redis 事务是什么核心回答Redis 的事务通过MULTI、EXEC、DISCARD、WATCH四个命令实现。流程客户端发送MULTI开启事务随后发送的一系列命令会被放入队列中暂不执行直到收到EXEC命令服务端才会一次性按顺序执行队列中的所有命令。本质它更像是一个命令批处理机制保证了命令执行的串行性中间不会插入其他客户端的命令。”5. Redis 事务支持隔离性吗核心回答不支持传统的隔离级别如 Read Committed, Repeatable Read。Redis 事务在执行期间不保证数据的一致性视图。如果在事务执行过程中有其他客户端修改了数据当前事务读取到的可能是最新的数据取决于具体命令。它仅保证了串行化执行一旦事务开始执行EXEC 后其他客户端的命令必须等待当前事务执行完毕才能运行。”6. Redis 事务保证原子性吗支持回滚吗核心回答“这是一个常见的误区Redis 事务不支持回滚Rollback也不完全保证原子性。入队阶段如果语法错误如命令参数不对在执行EXEC时会直接报错整个事务不执行。执行阶段如果命令在运行时出错如对 String 类型做 List 操作Redis不会回滚之前已成功执行的命令而是跳过错误命令继续执行后面的。设计哲学Redis 作者认为大多数错误是代码逻辑错误开发阶段发现而非运行时错误。为了保持简单和高性能Redis 放弃了复杂的回滚机制。”第三部分持久化与选型 (Q7-Q8)7. 持久化机制有哪些核心回答Redis 提供两种持久化方式RDB (Snapshot)定时将内存快照以二进制形式保存到磁盘。优点是文件小、恢复快缺点是可能丢失最后一次快照后的数据。AOF (Append Only File)记录每条写操作命令。优点是数据更安全最多丢 1 秒缺点是文件大、恢复慢。混合持久化Redis 4.0结合了两者优点AOF 重写时将当前内存以 RDB 格式写入后续增量用 AOF 格式。既加快了重写速度又保证了数据完整性。”8. RDB 和 AOF 如何选择核心回答“生产环境通常同时开启混合使用首选 AOF 恢复因为 AOF 数据更完整Redis 重启优先加载 AOF。建议配置appendfsync everysec每秒刷盘平衡性能与安全。RDB 做冷备利用 RDB 体积小、恢复快的特点定期如每天备份用于灾难恢复或数据迁移。场景决策如果可以容忍分钟级数据丢失且追求极致启动速度可只用 RDB如果对数据极其敏感如金融应主要依赖 AOF。”第四部分高可用架构 (Q9-Q12)9. Redis 有哪些部署方案核心回答“主要有三种演进路线单机版适合开发测试或非核心业务存在单点故障风险。主从复制 哨兵 (Sentinel)实现了高可用HA。主从负责读写分离和冗余哨兵负责监控和自动故障转移。适合中小规模集群。Redis Cluster (集群)官方推荐的分布式方案。采用去中心化架构通过分片 (Sharding)实现水平扩展支持海量数据和高并发。适合大规模生产环境。”10. 主从架构原理核心回答“主从架构采用一主多从模式全量复制从节点首次连接时主节点执行bgsave生成 RDB 发送给从节点从节点加载 RDB。增量复制主节点将后续的写命令通过复制缓冲区实时发送给从节点。读写分离主节点负责写从节点负责读需配置replica-read-only yes。缺点主节点挂掉后需要人工干预将从节点提升为主无法自动故障转移。”11. 哨兵 Sentinel 机制核心回答“哨兵是 Redis 的高可用解决方案它本身也是一个分布式系统。三大功能监控不断检查主从节点是否健康。通知当节点故障时通过 API 通知管理员或其他程序。自动故障转移当主节点宕机哨兵集群投票选举出一个从节点晋升为新主并通知其他从节点切换上级。原理基于 Raft 算法的思想需要多数派哨兵N/2 1达成一致才能执行故障转移防止脑裂。”12. Redis Cluster 集群原理核心回答Redis Cluster 是官方的分布式分片方案解决了单机内存上限和单点故障问题。数据分片引入16384 个槽 (Slots)。Key 通过CRC16(key) % 16384计算归属哪个槽每个节点负责一部分槽。去中心化没有中心节点每个节点都存储元数据槽分布图。客户端连接任意节点若 Key 不在该节点会返回MOVED重定向响应指引客户端去正确的节点。高可用每个主节点可以配置多个从节点。主节点挂掉后从节点自动竞选升主类似哨兵机制但内置在集群协议中。扩容/缩容通过迁移槽Slots来实现无需停机。” 面试加分技巧串联回答如果面试官问得比较散你可以尝试串联起来回答展示系统性思维。例如“关于 Redis 的架构Q9我们通常从单机发展到主从Q10解决读写分离再引入哨兵Q11解决自动故障转移最后为了应对海量数据使用ClusterQ12进行分片。在这个过程中为了保证数据不丢失我们需要配置持久化Q7, Q8为了防止内存爆满需要配置淘汰策略Q1并避免使用KEYSQ3这种阻塞命令而在代码层面虽然 Redis 有事务Q4, Q5, Q6但我们要注意它不支持回滚复杂一致性最好由应用层或 Lua 脚本保证。”这样回答会让面试官觉得你不仅背了知识点而且真正理解了整个技术体系。