跳到主要内容

Redis

Redis 是内存 KV 存储,常用作缓存、计数、分布式锁、简单队列。通用缓存模式见 缓存与消息队列;本篇专注 Redis 本身。

Redis 解决什么​

场景用法
热点读String / Hash 缓存对象
计数 / 限流INCR、滑动窗口
排行榜Sorted Set(ZSet)
去重 / 标签Set
队列(轻量)List / Stream(严肃 MQ 见 Kafka)
分布式锁SET key NX EX + 唯一 value

数据结构(面试必背)​

类型典型命令场景
StringGET/SET/INCR缓存、计数
HashHGET/HSET对象字段
ListLPUSH/BRPOP简单队列
SetSADD/SMEMBERS去重、共同好友
ZSetZADD/ZRANGE排行榜、延迟队列
StreamXADD/XREADGROUP消费组、类 MQ

单线程模型​

命令执行 单线程(6.0+ 多 IO 线程处理网络,命令仍主线程):

含义实践
命令原子复杂逻辑用 Lua 或 MULTI/EXEC
避免阻塞禁 KEYS *、大 key、O(N) 全表扫
热 key本地缓存、多副本、拆分 key

持久化​

方式说明
RDB快照;恢复快,可能丢最后一次快照后的数据
AOF追加写命令;可 everysec;文件更大
混合RDB + 增量 AOF(常用)

缓存场景可 不持久化;锁/计数要看能否重建。

高可用​

方案说明
主从复制异步复制;读从有延迟
Sentinel监控、自动 failover
Cluster16384 slot 分片;跨 slot 操作受限

缓存三大问题​

问题解法
穿透布隆过滤器、空值缓存
击穿互斥锁重建、逻辑过期
雪崩TTL 随机抖动、多级缓存、限流降级

详见 缓存与消息队列 与 限流熔断与降级。

分布式锁​

SET lock:order:123 <uuid> NX EX 30
-- 释放时 Lua:if GET==uuid then DEL
注意说明
必须设 TTL防死锁
唯一 value防误删他人锁
Redlock多节点方案,争议点到即可
续期看门狗延长 TTL(长任务)

业务强一致仍靠 DB 唯一约束 / 乐观锁。

常见误解​

  1. 「Redis 就是缓存」——角色还包括计数、锁、Coordination
  2. 「List 当 Kafka 用」——无持久与消费语义保障时别当主 MQ
  3. 「Cluster 无限扩容」——跨 slot 事务/MGET 受限,要设计 key

面试速记​

  1. 为什么快? 内存、单线程无锁竞争、IO 多路复用、高效数据结构。
  2. RDB vs AOF? 快照 vs 日志;混合常用。
  3. 穿透击穿雪崩? 各自定义与解法。
  4. 分布式锁要点? NX+EX、唯一 value、Lua 释放。
  5. 热 key? 本地缓存、复制、拆分、读写分离。