继续我们的 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)—— 写命令日志

  • 原理:将每一条写命令(如 SETHSET)以文本格式追加到 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 过期策略有哪三种,为什么选择惰性删除和定期删除策略

理论上的三种删除策略

  1. 定时删除:Key 过期立即创建定时器删除。对 CPU 极不友好,被 Redis 抛弃。

  2. 惰性删除:访问 Key 时才检查是否过期,过期则删除。对 CPU 友好,对内存不友好(过期但永不访问的 Key 会常驻内存)。

  3. 定期删除:每隔 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 底层原理、排行榜算法,以及如何用布隆过滤器、互斥锁、熔断降级彻底干掉缓存三大杀手(穿透、击穿、雪崩)。

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐