返回归档
Redis

Redis-持久化

文章目录

RDB (Redis Database File)

核心:将某个时间点的所有数据生成快照(snapshot),保存为二进制文件(默认文件名:dump.rdb)

实现原理

image

  1. Redis主进程fork一个子进程
  2. 子进程与主进程基于操作系统的Copy-On-Write(COW)机制共享同一份内存空间
  3. 子进程把数据序列化写入RDB文件中
  4. 主进程仍然可以继续处理请求
    1. 如果主进程在fork后修改了某份数据,OS会复制要修改那部分内存页,而不是整个内存,主进程操作副本
    2. 子进程依然利用旧的内存数据完成RDB操作

bgsave的参数设置

可以通过配置save的参数,来实现RDB多久触发一次

save 900 1
save 300 10
save 60 10000
  • 900秒内有 ≥1 次修改则触发
  • 300秒内有 ≥10 次修改则触发
  • 60秒内有 ≥10000 次修改则触发

RDB的优势和劣势

  • pros
    • 文件体积小,加载速度快
    • 对性能影响小(后台fork的子进程负责持久化)
    • 相比于AOF,数据恢复快
  • cons
    • 无法保存实时的数据
    • 对于大内存redis实例,一次fork开销还是挺大的

AOF (Append Only File)

实现原理

核心:将每个写入命令以日志方式追加写入,形成appendonly.aof 文件

不保存数据,只保存“执行过哪些写指令”。

image

每次写操作:

  1. Redis 将写命令写入 AOF buffer
  2. 根据策略决定何时 fsync 写入磁盘

AOF 文件类似于:

SET a 1
INCR counter
LPUSH list 123
...

持久化参数设置

appendfsync always | everysec | no

其中有三种appendfsync的配置参数可以选

  1. Always,这个单词的意思是「总是」,所以它的意思是每次写操作命令执行完后,同步将 AOF 日志数据写回硬盘
  2. Everysec,这个单词的意思是「每秒」,所以它的意思是每次写操作命令执行完后,先将命令写入到AOF 文件的内核缓冲区,然后每隔一秒将缓冲区里的内容写回到硬盘
  3. No,意味着不由Redis控制写回硬盘的时机,转交给操作系统控制写回的时机,也就是每次写操作命令执行完后,先将命令写入到 AOF 文件的内核缓冲区,再由操作系统决定何时将缓冲区内容写回硬盘。

image

AOF的优缺点

  • pros
    • 相比于RDB,数据持久化更安全,丢失极少(每秒或更小)
    • 日志格式可读性高,可用于排查问题
    • 支持Rewrite,实现AOF文件压缩
  • cons
    • 由于需要大量指令的replay,所以执行数据恢复所需时间长
    • AOF以文本方式存储,压缩比例小,文件体积大
    • fsync可能造成写压力

使用混合方式实现 数据的持久化

Redis 的4.0+引入了混合模式,结合RDB和AOF的各自优势。

RDB的加载速度很快,AOF的实时性很高,这样可以最大程度避免数据的丢失

配置开启混合持久化

# 开启混合持久化
aof-use-rdb-preamble yes

配置AOF的持久化策略

# 建议使用 everysec,兼顾性能和数据安全
appendfsync everysec    # 每秒同步一次

# AOF 重写触发条件
auto-aof-rewrite-percentage 100  # AOF 文件增长率
auto-aof-rewrite-min-size 64mb   # AOF 文件重写最小大小

配置多久执行一次RDB快照

# 自动保存策略(建议根据实际业务调整)
save 3600 1      # 1小时内至少1个修改
save 300 100     # 5分钟内至少100个修改
save 60 10000    # 1分钟内至少10000个修改

# RDB 文件配置
dbfilename dump.rdb
dir /path/to/redis/data    # RDB 文件保存路径

工程级的最佳实践

# 开启混合持久化
aof-use-rdb-preamble yes

# 使用性能均衡的 AOF 持久化策略
appendfsync everysec

# 自动重写设置
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb

# RDB 定时快照
save 3600 1
save 300 100
save 60 10000

# 文件名与存储路径
dbfilename dump.rdb
appendfilename appendonly.aof
dir /data/redis