For AI agents: the complete documentation index is available at https://tingfeng347.github.io/windwiki/llms.txt, the full documentation bundle is available at https://tingfeng347.github.io/windwiki/llms-full.txt, and this page is available as Markdown at https://tingfeng347.github.io/windwiki/terminology/redis-cache.md.

Redis 与缓存 · 面试清单

面试权重:★★★★★ 「Redis 为什么快」「缓存三大问题」「缓存一致性」几乎是必问三连。


一、定位与为什么快

术语一句话释义
Redis 定位内存型 KV 数据结构服务器,常作缓存、分布式锁、计数器、排行榜、消息队列
为什么快纯内存 + 单线程免锁免切换 + IO 多路复用 + 高效数据结构与编码
单线程还能高并发瓶颈在内存与网络而非 CPU,单线程避免了锁竞争与上下文切换;6.0 起网络 IO 可多线程
Redis vs MemcachedRedis 支持数据结构、持久化、集群、脚本;Memcached 只有 KV 且纯内存
Redis vs 本地缓存本地缓存(Caffeine)纳秒级但有数据一致性与容量问题;Redis 跨进程共享但多一次网络开销
RESP 协议Redis 的文本序列化协议,简单可读、易解析
Pipelining一次发多条命令不等待回应,减少 RTT;与应用层批量命令(MGET)不同
Lua 脚本 / FUNCTION服务端原子执行多步逻辑,是分布式锁释放等场景的常用手段
多路复用Redis 6 前用 epoll 单线程事件循环,6.0 起读写 IO 交给 IO 线程、命令执行仍单线程

二、数据结构与底层编码

术语一句话释义
String二进制安全字符串,可做缓存、计数器(INCR)、分布式锁
List双向链表/压缩列表(listpack),适合队列与最新列表(LPUSH+LRANGE)
Hash字段级读写,适合存对象的部分字段
Set无序去重集合,支持交并差,适合标签、共同好友
ZSet(Sorted Set)带分值的跳表 + 哈希,适合排行榜、延时队列、范围查询
Bitmap位操作,适合签到、活跃统计,极省内存
HyperLogLog基数估算(UV 统计),误差约 0.81%,固定 12KB
GEO基于 ZSet 的地理位置索引,支持附近的人
Stream持久化消息流,支持消费组与 ACK,对标轻量版 Kafka
SDSRedis 自实现的字符串,记录长度、预分配、二进制安全
跳表 SkipList多层链表实现有序集合,实现比平衡树简单、范围查询友好、并发写友好
listpack / ziplist小数据量的紧凑连续内存编码,超过阈值转为跳表/哈希表
渐进式 rehash大字典扩容时分批迁移,避免一次性阻塞
OBJECT ENCODING查看某个 key 的底层编码,是判断配置是否生效的直接手段

三、过期、淘汰与内存

术语一句话释义
过期策略惰性删除(访问时判断)+ 定期删除(每 100ms 抽样),两者结合
内存淘汰策略noeviction、allkeys-lru/lfu、volatile-lru/lfu/ttl/random
LRU vs LFULRU 看最近访问时间,LFU 看访问频次;突发的全表扫描会让 LRU 误伤热点,LFU 更适合缓存
maxmemory必须显式设置,否则 Redis 会一直吃到 OOM 被系统杀掉
maxmemory-policy 选择纯缓存场景用 allkeys-lfu;有不能丢的 key 时用 volatile-* 并给它们设 TTL
内存碎片率mem_fragmentation_ratio,大于 1.5 且持续偏高时考虑 activedefrag
大 Key单个 value 过大(如 >10KB 或元素数 >5000);删除/读取都会阻塞主线程,要拆分成多个 key
热 Key单 key QPS 极高;靠本地缓存、多副本打散、读写分离缓解
Key 命名规范业务前缀 + 冒号分层(user:1001:profile),便于统计与批量清理
MEMORY USAGE / redis-cli --bigkeys扫描大 key;生产上用 --bigkeys 要在低峰执行
删除大 key 的姿势用 UNLINK(异步删除)或 SCAN 分批删,别用 DEL 直接删

四、持久化

术语一句话释义
RDB某一时刻的内存快照(二进制),恢复快、体积小,但会丢最近的数据
AOF追加写命令日志,按 appendfsync 决定安全级别;恢复慢、体积大
appendfsync 三档always 最安全最慢、everysec 默认(最多丢 1 秒)、no 交给 OS
AOF 重写用最小命令集重写日志以压缩体积,靠 BGREWRITEAOF 或自动触发
混合持久化Redis 4.0+ RDB 头 + AOF 增量,兼顾恢复速度与数据安全,生产的常见选择
fork 与 COWBGSAVE/重写靠 fork 子进程 + 写时复制,数据量大时 fork 会短暂阻塞
如何选择缓存场景可只开 RDB;不能丢数据用 AOF everysec + 混合持久化 + 定期备份

五、高可用与集群

术语一句话释义
主从复制从库 replicaof 主库,异步复制;只解决读扩展与备份,不自动故障转移
全量同步 vs 增量同步首次/断连过久走全量(RDB + 缓冲区命令),否则按 offset 续传
复制积压缓冲区主库维护的环形缓冲,从库重连时若 offset 还在其中即可增量同步
哨兵 Sentinel独立进程监控主从,主观下线 + 客观下线判定后自动选主并通知客户端
哨兵选主规则优先级 → 复制 offset 最大 → runid 最小
Cluster 分片16384 个哈希槽,CRC16(key) % 16384 决定槽位,节点各自负责一部分
槽迁移与 MOVED / ASK客户端收到重定向后要更新本地槽映射;ASK 是迁移过程中的临时重定向
Hash Tag {}让多个 key 落在同一槽,从而支持 Cluster 下的多 key 操作
Cluster 的局限不支持跨槽事务与多 key 操作,KEYS/SCAN 只能单节点视角
脑裂与数据丢失主库网络分区期间仍接收写,恢复后这批写会丢;min-replicas-to-write 可缓解
Cluster vs 哨兵数据量大或写压力大用 Cluster;数据量小只求高可用用哨兵

六、缓存设计与一致性问题

术语一句话释义
Cache Aside最主流:读时未命中则查库回填,写时先更新库再删缓存
为什么是删缓存而不是更新缓存更新缓存在并发下会写进脏数据,删除更安全也更省一次写
先删缓存还是先更新库一般先更新库再删缓存;担心并发旧值回填就用延迟双删或订阅 binlog 异步删
延迟双删更新库 → 删缓存 → 延迟一小段再删一次,兜住并发回填的旧值
缓存穿透查不存在的数据,每次都打到库;解法是空值缓存(短 TTL)+ 布隆过滤器
布隆过滤器概率型结构,判断「一定不存在」可靠、「存在」可能误判,不支持删除(可用计数版)
缓存击穿热点 key 过期瞬间大量请求直达数据库;解法是互斥锁重建、逻辑过期不设 TTL
缓存雪崩大量 key 同时过期或 Redis 整体宕机;解法是 TTL 加随机抖动、多级缓存、限流降级
缓存一致性等级严格强一致需要串行化或分布式锁,工程上通常接受「最终一致 + 短暂脏读」
Cache-Aside vs Read/Write-Through vs Write-Behind前者应用管缓存;中间件管读写(强一致但慢);回写(快但可能丢数据)
热点数据的多级缓存本地缓存 + Redis + 数据库三层,配合变更通知失效

七、分布式锁与限流

术语一句话释义
SET key val NX PX ms加锁的标准写法,必须带过期时间防死锁
锁的释放用「值等于自己的唯一 ID 再删」的 Lua 脚本,避免误删别人的锁
锁续期 Watchdog业务没执行完而锁快到期时自动延长,Redisson 提供该能力
RedLock 的争议多节点多数派加锁;争议点在于依赖时钟、GC 停顿下安全性存疑
Redis 锁 vs ZooKeeper 锁Redis 性能高但极端场景可能失效;ZK 靠临时顺序节点更严谨但性能低
限流的 Redis 实现固定窗口(INCR+EXPIRE)、滑动窗口(ZSet)、令牌桶(Lua)
固定窗口的临界问题窗口边界处可能放行 2 倍流量,滑动窗口或令牌桶可解决
分布式 ID / 计数器INCR 或 INCRBY 做序列号与计数,注意单点与持久化策略

八、线上排查

术语一句话释义
INFO 关注项used_memory、mem_fragmentation_ratio、instantaneous_ops_per_sec、keyspace_hits/misses
命中率hits / (hits + misses),长期低于 90% 说明缓存设计有问题
SLOWLOG GET看慢命令,阈值 slowlog-log-slower-than 默认 10ms
CLIENT LIST看连接来源与空闲情况,排查连接泄漏
LATENCY DOCTOR内置延迟诊断,给出最近的延迟事件与建议
常见阻塞原因大 key 操作、KEYS/FLUSHALL、AOF 重写与 fork、主从全量同步、网络与 swap
禁止在生产使用的命令KEYS(改用 SCAN)、FLUSHALL、FLUSHDB、CONFIG SET 高危项
swap 的影响Redis 被换出到磁盘会带来秒级卡顿,必须禁用/限制其 swap

参考资料