跳转至

🔴 Redis(数据结构 / 持久化 / 集群 / 缓存三大坑)

高频缓存与计数器、分布式锁首选。覆盖:五大数据结构及扩展、持久化、高可用、缓存典型问题、分布式锁、内存淘汰。 依据 Redis Official Docs(官方为准)。

📌 适用版本 / 更新日期:Redis 7.x(含 7.4 LTS 思路);最后更新 2026-08


1. 五大数据结构(及选型)

结构 特点 场景 注意
String 二进制安全,最大 512MB 缓存、计数器 INCR、分布式锁 大 value 阻塞
Hash 字段-值映射 对象属性(用户资料) 避免大 Hash 单 key
List 双向链表/压缩列表 队列、最新列表 大列表 LRANGE
Set 无序去重 标签、点赞、交集
ZSet 带分数有序 排行榜、延迟队列 按 score 范围查

进阶结构(官方)

  • Bitmap:用户签到、布隆过滤器的底层。
  • HyperLogLog:UV 去重估算(误差 ~0.81%)。
  • Geo:经纬度附近的人。
  • Stream:消息队列(Kafka 轻量替代,支持消费组)。

2. 持久化

方式 机制 优点 缺点
RDB 定时快照 恢复快、文件小 丢最后一次快照后数据
AOF 追加写命令 数据更安全(everysec 文件大、恢复慢
混合(推荐) RDB+AOF 兼顾 Redis 4+ 默认 aof-use-rdb-preamble

持久化配置

  • AOF appendfsynceverysec(默认,最多丢 1s)优于 always(慢)和 no(依赖 OS)。
  • 生产开混合持久化,重启恢复快且数据全。

3. 高可用

  • 主从复制:读写分离,从库异步复制(有延迟);主挂需人工/哨兵切换。
  • 哨兵(Sentinel):监控+自动故障转移+配置中心。
  • Cluster(集群):数据分槽(16384 槽),多主多从,自动分片与故障转移。

Cluster 限制

  • 不支持多 key 跨槽事务/mget(除非同 slot,用 hash tag {user1} 强制同槽)。
  • 单 key 最大 512MB,单节点内存建议 ≤ 数 GB 便于迁移。

4. 缓存三大坑(必考必踩)

4.1 缓存穿透(查不存在的数据)

  • 现象:恶意/异常请求 id=-1,缓存和 DB 都没有 → 每次打到 DB。
  • 对策:null 缓存短过期、布隆过滤器(Bitmap)拦截不存在 key。

4.2 缓存击穿(热点 key 过期瞬间)

  • 现象:某超热 key 到期,瞬间大量请求穿透到 DB。
  • 对策:热点 key 不过期(逻辑过期)、互斥锁单飞重建(SETNX 重建中只放一个查 DB)。

4.3 缓存雪崩(大量 key 同时过期 / Redis 挂)

  • 现象:大批 key 同一时刻失效,或 Redis 宕机,DB 被打崩。
  • 对策:过期时间加随机抖动;多级缓存;Redis 高可用(哨兵/集群);限流降级。

经典错误实现

  • 分布式锁用 SETNX忘记设超时 → 持有锁的进程崩了,锁永不释放。正确:SET key val NX PX 30000(设值同时设过期,原子)。
  • 锁释放不校验持有者 → 误删别人的锁。正确:用唯一 value,释放时 Lua 脚本比对再删(保证原子)。

5. 分布式锁(正确姿势)

-- 加锁(原子设值+过期)
SET lock:order:1 <uuid> NX PX 30000
-- 释放(仅当是自己持有才删,Lua 原子)
if redis.call('get', KEYS[1]) == ARGV[1] then
  return redis.call('del', KEYS[1])
else return 0 end

生产建议

  • 锁粒度要细(订单级而非全表级),持有时间要估准并留余量。
  • 需要可重入/自动续期 → 用 Redisson(官方社区库)RLock,自带 watchdog 续期。

6. 内存淘汰与键过期

策略 maxmemory-policy 行为
noeviction(默认) 写满报错(缓存场景不推荐)
allkeys-lru 所有 key LRU 淘汰(缓存常用
volatile-lru 仅设了过期时间的 key LRU
allkeys-lfu LFU(访问频率,更准)

大 key / 热 key

  • 大 key(如 1MB 的 Hash/大 List)删除/传输阻塞单线程 → 用 UNLINK(异步删)代替 DEL
  • 热 key(单 key 极高 QPS)打满单节点 → 本地缓存 + 多副本打散。

7. 自测

Q: 热点 key 突然失效,大量请求打到 DB 怎么办?
A: 互斥锁单飞重建 + 热点 key 逻辑过期 + 布隆过滤器防穿透 + 过期加随机防雪崩。

下一章:Spring Boot