🔴 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
appendfsync:everysec(默认,最多丢 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