继续我们的 Redis 内核探索之旅。本章我们不讲业务,只聊数据安全性与内存韧性。
📑 中篇目录
提问六:Redis 的持久化机制底层原理和配置方式,RDB 持久化修改数据,是如何保证异步子进程数据冲突的
提问七:Redis 过期策略有哪三种,为什么选择惰性删除和定期删除策略
提问八:Redis 的内存淘汰策略和过期策略区别,有哪些策略
六、Redis 的持久化机制底层原理和配置方式,RDB 持久化修改数据,是如何保证异步子进程数据冲突的
Redis 提供了两种核心持久化机制:RDB(快照)与AOF(日志),以及 4.0 版本引入的混合持久化。
1. RDB(Redis DataBase)—— 全量快照
原理:在触发条件(如
save 900 1)满足时,主进程fork()一个子进程,由子进程将当前内存数据写入一个压缩的二进制 RDB 文件。配置:
conf
save 900 1 save 300 10 save 60 10000 dbfilename dump.rdb rdbcompression yes
2. AOF(Append Only File)—— 写命令日志
原理:将每一条写命令(如
SET、HSET)以文本格式追加到 AOF 文件末尾。核心同步策略(
appendfsync):always:每次写入都刷盘(最安全,最慢)。everysec:每秒刷盘一次(推荐,最多丢 1 秒数据)。no:交由操作系统调度(最快,但可能丢大量数据)。
AOF 重写:当 AOF 文件膨胀时,触发后台重写(
bgrewriteaof)瘦身。
3. 混合持久化(Redis 4.0+)
配置aof-use-rdb-preamble yes。AOF 重写时,文件头部直接写入 RDB 格式的快照,尾部追加增量 AOF 日志,重启时恢复速度极快。
4. 如何保证异步子进程数据不冲突?(写时复制 COW)
这是最精妙的设计:执行bgsave或bgrewriteaof时,主进程fork()子进程,父子进程共享同一份物理内存页表。
父进程继续处理写入请求。
当父进程要修改某个内存页时,操作系统触发写时复制(Copy-On-Write),将该页物理内存复制一份副本给父进程修改。
子进程从头到尾读取的都是
fork()那一刻的旧内存页快照。两者互不干扰,完美解决数据冲突!
七、Redis 过期策略有哪三种,为什么选择惰性删除和定期删除策略
理论上的三种删除策略
定时删除:Key 过期立即创建定时器删除。对 CPU 极不友好,被 Redis 抛弃。
惰性删除:访问 Key 时才检查是否过期,过期则删除。对 CPU 友好,对内存不友好(过期但永不访问的 Key 会常驻内存)。
定期删除:每隔 100ms(由
hz参数控制)随机抽取一批设置了 TTL 的 Key 检查删除。折中方案。
Redis 最终选择:惰性删除(守门员)+ 定期删除(巡逻队)
这是一种CPU 与内存的务实权衡:
用惰性删除保证 CPU 绝对不被额外消耗。
用定期删除(默认每秒 10 次,每次抽 20 个 Key,删除超过 5 个则继续循环,但总耗时不超过 25ms)防止内存被过期 Key 撑爆。
两者结合,确保系统在面对千万级 Key 时依然稳定高效。
八、Redis 的内存淘汰策略和过期策略区别,有哪些策略
核心区别(面试高频陷阱)
过期策略(Expiration):处理TTL 到达 0的 Key,是主动清理“垃圾”。
淘汰策略(Eviction):处理内存达到
maxmemory上限时的窘境,无论 Key 是否过期,强制“扔东西”腾空间。
Redis 的 8 种内存淘汰策略
| 分类 | 策略名称 | 行为 |
|---|---|---|
| 默认 | noeviction | 拒绝写入,返回错误(默认策略) |
| 全键(Allkeys) | allkeys-lru | 淘汰最近最少使用的 Key(最推荐) |
| 全键 | allkeys-lfu | 淘汰访问频率最低的 Key(4.0+,更精准) |
| 全键 | allkeys-random | 随机淘汰 |
| 过期键(Volatile) | volatile-lru | 只在有 TTL 的 Key 中淘汰 LRU |
| 过期键 | volatile-lfu | 只在有 TTL 的 Key 中淘汰 LFU |
| 过期键 | volatile-random | 只在有 TTL 的 Key 中随机淘汰 |
| 过期键 | volatile-ttl | 淘汰剩余生存时间最短的 Key |
调优参数:
maxmemory-samples 5(默认采样 5 个,调高至 10 可提升淘汰精准度,但稍耗 CPU)。
💎 中篇总结与预告
中篇我们剥开了持久化的外衣,看到了fork()与写时复制的操作系统级魔法,也理清了过期与淘汰的本质区别。下篇(终章),我们将直面缓存架构师的终极考验:五种数据类型的场景博弈、分布式锁的 Redisson 底层原理、排行榜算法,以及如何用布隆过滤器、互斥锁、熔断降级彻底干掉缓存三大杀手(穿透、击穿、雪崩)。