一、开场先澄清场景Redis 优化没有银弹要先明确 Redis 的角色 和 瓶颈在哪纯缓存可牺牲持久化优先吞吐和内存存储/消息队列要兼顾持久化、一致性、可用性瓶颈可能是内存、CPU、网络、单线程阻塞、热 key、大 key、持久化、主从延迟等这句话能体现你不是背八股而是会分析问题。二、内存优化最常考1. 选对数据结构小对象用 Hash 存字段比多个 String key 更省内存底层编码可压缩排行榜用 ZSet去重用 Set计数用 String/INCR避免滥用 String 存 JSON大对象可考虑 Hash 分字段或压缩2. 控制 key 设计避免大 key单个 key 的 value 过大如百万级 Hash/List会导致读写阻塞Redis 单线程主从同步慢、AOF rewrite 卡顿内存碎片、淘汰困难避免 key 过多大量小 key 也有元数据开销合理设置 TTL防止内存只增不减3. 内存上限与淘汰策略maxmemory 4gb maxmemory-policy allkeys-lru # 纯缓存常用 # volatile-lru / allkeys-lfu 等按场景选纯缓存allkeys-lru/allkeys-lfu部分 key 需持久保留volatile-lru4. 编码与配置调优了解 Redis 内部编码如 listpack、intset小数据会自动压缩可用MEMORY USAGE key分析内存占用三、性能优化吞吐与延迟1. 减少网络往返Pipeline批量发命令减少 RTTMGET/MSET批量读写Lua 脚本多步操作原子执行减少往返2. 避免慢命令危险命令问题替代方案KEYS *O(N) 阻塞SCAN游标迭代HGETALL大 Hash阻塞HSCAN或拆分SMEMBERS大 Set阻塞SSCANLRANGE 0 -1大 List阻塞分页读取3. 连接管理使用 连接池避免频繁建连合理设置超时、重试避免连接泄漏4. 异步删除Redis 4.0 用UNLINK替代DEL删除大 key后台线程异步释放内存四、热 Key 与大 Key 问题热 KeyHot Key本地缓存Caffeine/Guava多级缓存减轻 Redis 压力读写分离热 key 读走从库注意主从延迟key 拆分如user:1000→user:1000:0~user:1000:9分散到不同 slotRedis 6.0redis-cli --hotkeys或监控发现大 KeyBig Key拆分大 Hash 按 field 范围拆成多个 key压缩value 序列化后 gzip定期清理SCANUNLINK分批删除排查redis-cli --bigkeys、MEMORY USAGE五、持久化优化场景建议纯缓存可关闭 RDB/AOF可接受分钟级丢失RDB快照需高可靠AOF appendfsync everysec兼顾性能与可靠Redis 4.0 混合持久化RDB AOF 增量注意AOF rewrite 会 fork大内存实例可能卡顿可设auto-aof-rewrite-percentage控制 rewrite 频率六、架构与高可用1. 水平扩展Redis Cluster16384 slot 分片突破单机内存/吞吐注意跨 slot 的 multi-key 操作 受限可用 hash tag{user}:10002. 读写分离主写从读注意 主从延迟 导致读到旧数据强一致读需走主库3. 高可用Sentinel主从 自动故障转移Cluster分片 高可用七、监控与排查slowlogSLOWLOG GET查慢命令latency doctor延迟诊断INFO memory/stats内存、命中率、连接数redis-exporter Prometheus Grafana持续监控关注命中率、evicted_keys、blocked_clients、used_memory_rss碎片八、回答模板可直接背Redis 优化我会从几个层面看内存选对数据结构、控制 key 大小和数量、设 maxmemory 和淘汰策略、合理 TTL性能Pipeline 减 RTT、避免 KEYS/HGETALL 等慢命令、用 UNLINK 删大 key、连接池热点热 key 用本地缓存或 key 拆分大 key 拆分或压缩持久化纯缓存可关要可靠用 AOF 或混合持久化并控制 rewrite架构单机不够就 Cluster 分片读多就主从读写分离监控slowlog、bigkeys、hotkeys、命中率先定位再优化九、常见追问及简答追问要点LRU 和 LFU 区别LRU 看时间LFU 看频率LFU 对热 key 更友好为什么 Redis 单线程还快纯内存、IO 多路复用、无锁、简单数据结构热 key 导致单点打满怎么办本地缓存 key 拆分 多副本如何保证缓存与 DB 一致先更新 DB 再删缓存、延迟双删、Canal 订阅 binlogCluster 如何分片CRC16(key) % 16384 得到 slot