Redis 常见知识总结
1. Redis 常见应用场景
| 场景 | 作用描述 |
|---|---|
| 缓存 | 提高读性能,减少数据库压力,解决缓存穿透/击穿/雪崩问题 |
| 分布式锁 | 使用 SETNX、Redisson 实现分布式锁 |
| Token 存储 | 适用于 JWT、Session 共享等场景 |
| 消息队列 | 作为轻量级消息队列使用(list / stream) |
| 计数器 | 使用 INCR 进行点赞、浏览量统计 |
| 延迟队列 | 使用 zset(有序集合)模拟延迟任务 |
2. Redis 持久化机制
2.1 RDB(快照持久化)
✅ 原理:定期将 内存数据快照 持久化到磁盘,适用于数据量较大但容忍少量数据丢失的场景。
✅ 优点:
- 备份文件体积小,适合全量数据恢复。
- 读取速度快,适合冷启动恢复。
✅ 缺点:
bgsave期间,新数据可能丢失。fork进程占用 CPU 和内存,可能影响性能。
✅ 配置:
save 900 1 # 900s 内有 1 个 key 变更触发 RDB
save 300 10 # 300s 内有 10 个 key 变更触发 RDB
save 60 10000 # 60s 内有 10000 个 key 变更触发 RDB
✅ RDB 触发方式:
- 手动触发:
SAVE(阻塞) 或BGSAVE(后台异步)。 - 自动触发:根据
save规则,达到阈值时触发。
2.2 AOF(追加式日志持久化)
✅ 原理:记录每个写操作的日志文件,Redis 重启时 按日志回放 恢复数据。
✅ 优点:
- 提供 更高的数据安全性,可减少数据丢失。
- AOF 可以重写,避免日志过大。
✅ 缺点:
- 文件体积比 RDB 大,恢复速度较慢。
- 写入性能略低(相比 RDB)。
✅ AOF 配置:
appendonly yes # 开启 AOF
appendfsync everysec # 每秒写入(默认),兼顾性能和数据安全
✅ AOF 重写机制:
- 执行
bgrewriteaof,Redis 会 仅保留最后的有效写操作,缩小 AOF 文件体积。 - 触发方式:手动
bgrewriteaof或自动触发(阈值控制)。
✅ 混合持久化(Redis 4.0+):
- RDB + AOF 结合,即 AOF 末尾存储 RDB 快照,提升恢复速度。
3. 缓存问题及解决方案
3.1 缓存穿透
现象:查询一个不存在的数据,导致请求全部落到数据库,造成 DB 压力过大。
解决方案:
- 缓存空值(简单有效,但占用内存):
{key:1, value: null} - 使用布隆过滤器(Bloom Filter):拦截不存在的 Key,避免 DB 查询。
3.2 缓存击穿
现象:某个热点 Key 过期,导致大量请求瞬间涌入数据库。
解决方案:
- 逻辑过期(后台异步刷新缓存,保证可用性)。
- 互斥锁(
SETNX加锁,确保只有一个线程回源更新)。
3.3 缓存雪崩
现象:大量 Key 在同一时间过期,导致数据库瞬间崩溃。
解决方案:
- TTL 设定随机值,避免同一时间过期。
- Redis 高可用(主从、集群)。
- 限流降级(熔断机制)。
4. Redis 数据一致性问题:延迟双删
4.1 传统双写问题(不安全)
UPDATE user SET balance = 100 WHERE id = 1;
DEL key:user:1;
问题:
- 高并发下可能写入旧数据(其他线程可能在
DEL后,回源写入旧缓存)。
4.2 延迟双删方案
DEL key:user:1;
UPDATE user SET balance = 100 WHERE id = 1;
SLEEP(1); -- 等待 1 秒(保证更新完成)
DEL key:user:1;
原因:
- 第一次删除:防止查询到旧缓存。
- 第二次删除(延迟):防止高并发写回旧值。
5. Redis 淘汰策略
| 策略 | 说明 |
|---|---|
noeviction(默认) | 不淘汰,内存满时报错 |
allkeys-random | 随机淘汰所有 Key |
volatile-random | 在 有 TTL 的 Key 中随机淘汰 |
allkeys-lru | 淘汰 最近最少使用(LRU) 的 Key |
volatile-lru | 在 有 TTL 的 Key 中淘汰 LRU |
allkeys-lfu | 淘汰 访问频率最少(LFU) 的 Key |
volatile-lfu | 在 有 TTL 的 Key 中淘汰 LFU |
推荐策略:
allkeys-lru适用于缓存场景(LRU 算法)。volatile-ttl适用于 TTL 过期策略。
总结
- 缓存问题:穿透(空值、布隆过滤器)、击穿(互斥锁)、雪崩(限流 + 随机 TTL)。
- 持久化方案:RDB(快照)、AOF(日志)、混合持久化。
- 数据一致性:延迟双删、异步 MQ 同步。
- 内存淘汰策略:LRU、LFU、随机淘汰。
评论区