Redie详细入门教程2
一、 Redis的持久化机制
1. RDB(快照)
-
原理:在指定时间间隔内,将内存中的数据集快照保存到磁盘上的二进制文件(默认
dump.rdb
)。 -
触发方式:
- 配置文件中的
save
指令(比如save 900 1
表示 900 秒内有 1 次修改则触发快照)。 - 手动执行
SAVE
(阻塞)或BGSAVE
(后台子进程异步执行)。
- 配置文件中的
-
优点:
- 文件紧凑,适合备份和灾难恢复。
- 恢复速度快,只需要加载快照文件。
-
缺点:
- 容易丢数据(快照间隔内的新数据未写入磁盘)。
- BGSAVE 会 fork 子进程,数据量大时可能造成性能抖动。
2. AOF( 追加日志)
-
原理:以日志的形式记录每一次写操作(追加到文件
appendonly.aof
),重启时通过回放日志重建数据。 -
写入策略(
appendfsync
参数):always
:每次写操作都刷盘,最安全但性能差。everysec
(默认):每秒刷盘一次,性能和安全折中。no
:由操作系统决定何时刷盘,性能最好但最不安全。
-
优点:
- 数据更安全,丢失的数据量小(取决于写入策略)。
- 日志文件可读性强,易于修复。
-
缺点:
- 文件体积大,恢复速度比 RDB 慢。
- 需要 AOF 重写(
BGREWRITEAOF
)来压缩文件,否则无限膨胀。
3. RDB + AOF 混合持久化(Redis 4.0+)
-
原理:结合 RDB 的快照和 AOF 的日志优势。
- 先生成一份 RDB 快照作为基准点。
- 之后再记录增量写操作到 AOF。
-
优点:
- 重启时先加载 RDB,再追加少量 AOF 日志,速度快且丢失数据少。
-
缺点:
- 文件格式更复杂(不再完全可读)。
4. 无持久化
- 可以通过配置
save ""
关闭 RDB,或者不启用 AOF。 - 适用于缓存场景(只要求高性能,不要求数据持久)。
- 高性能但可能丢数据 → 用 RDB。
- 高安全性,几乎不丢数据 → 用 AOF(everysec)。
- 折中方案 → 混合持久化(推荐 Redis 4.0+ 默认配置)。
- 只当缓存用 → 可以关闭持久化。
二、Redis主从复制的实现原理
1. 建立复制关系
- 配置:在从库(replica/slave)中使用
replicaof <masterip> <masterport>
指定主库。 - 连接:从库会主动和主库建立 TCP 连接,并发送
PSYNC
命令请求数据同步。
2. 全量复制
第一次建立主从关系时,通常需要执行一次 全量复制:
- 主库执行 RDB 快照
主库 fork 出一个子进程,生成 RDB 文件(快照),同时继续接收客户端写操作。 - 数据传输
主库将生成的 RDB 文件传输给从库,从库加载到内存,形成和主库一致的数据副本。 - 命令缓冲区
在主库生成快照和传输过程中,新的写命令会暂存在复制缓冲区(repl backlog)中。 - 应用命令
从库加载完 RDB 后,再应用主库传来的缓冲区命令,最终和主库保持一致。
3. 增量复制
全量复制完成后,进入 增量复制阶段:
- 主库会把自己收到的 写命令(set、del、incr 等)按顺序发送给从库。
- 从库执行这些命令,保证和主库的数据保持实时一致。
三、Redis数据过期后的删除策略
1. 惰性删除(Lazy Deletion)
-
原理:只有当客户端访问某个 key 时,Redis 才检查它是否过期。
- 如果过期 → 立刻删除,不返回结果。
- 如果没过期 → 正常返回。
-
优点:几乎零开销,不需要定时扫描。
-
缺点:如果一个过期 key 长时间没人访问,它会一直占用内存。
2. 定期删除(Periodic Deletion)
-
原理:Redis 每隔一段时间(默认 100ms)随机抽取一定数量的 key 进行过期检查,删除已过期的。
-
策略:
- Redis 不会一次性扫描所有 key(否则会阻塞),而是随机挑一些带 TTL 的 key。
- 如果发现过期比例过高,就会继续多做几轮,避免过多垃圾留在内存里。
-
优点:减少无效内存占用。
-
缺点:删除不是实时的,仍可能有延迟。
3. 内存淘汰策略(当内存不足时)
如果过期 key 太多但未被清理,而内存不足,就会触发 内存淘汰机制(maxmemory-policy):
- noeviction:不再写新数据,报错(默认)。
- allkeys-lru:淘汰最近最少使用的 key(全局范围)。
- volatile-lru:淘汰最近最少使用的、带过期时间的 key。
- allkeys-random:随机淘汰任意 key。
- volatile-random:随机淘汰带过期时间的 key。
- volatile-ttl:优先淘汰 TTL 剩余时间最短的 key。