3

Redis 深入 (1) 持久化

 3 years ago
source link: https://blog.duval.top/2021/04/12/Redis-%E6%B7%B1%E5%85%A5-1-%E6%8C%81%E4%B9%85%E5%8C%96/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

Redis 常用的持久方式主要有三种:RDB 方式、AOF 方式以及混合持久化方式。

RDB 持久化

默认情况下,Redis 会定时自动把数据库内存数据以快照的形式保存到 dump.rdb 文件中。

Redis 通过 bgsave 自动生成快照,可以通过修改配置控制快照频率以及快照名字:

## 3600秒内至少有1个键被修改
save 3600 1
## 300秒内至少有1个键被修改
save 300 100
## 60秒内至少有1个键被修改
save 60 10000

## 配置快照文件名
dbfilename dump.rdb

除了定时自动保存快照,还可以通过执行 save 和 bgsave 命令进行触发。

save 命令会被 Redis 主线程同步执行,并阻塞后来的客户端命令;

bgsave 则是通过主线程fork 出新的子进程,并共享主线程所有的内存数据。bgsave 借助了操作系统的写时复制技术(Copy On Write,COW)。如果主线程只读,则主线程和 bgsave 子进程互不影响;但如果主线程写数据,则对应位置数据会被复制一个副本,以供 bgsave 读取并写入 RDB 文件。因此,bgsave 是一个异步过程,不会阻塞客户端命令,但 fork 操作对主线程有一定阻塞影响。

AOF 持久化

AOF 持久化方式会将每一条指令都记录到操作系统缓存,并定时通过 fsync 持久化到磁盘文件 appendonly.aof 上。

通过以下配置可以打开 AOF 持久化功能:

appendonly yes

自动 fsync

可以通过配置修改 fsync 频率:

# 每当有新的命令追加到 AOF 文件就执行一次 fsync。最慢最安全,最坏情况只会丢失一条命令。
appendfsync always
# 每秒钟 fsync 一次。最坏情况只会丢失一秒钟内执行的命令
appendfsync everysec
# 从不主动执行 fsync,完全交给操作系统决定执行时间。最快,但不安全。
appendfsync no

AOF 重写

随着执行的命令不断增加,AOF 文件中会包含大量冗余的命令,需要进行重写压缩文件空间。有两个参数可以控制重写:

## 当 AOF 文件大小达到 64MB 会触发重写
auto-aof-rewrite-min-size 64mb
## 当 AOF 文件相比上一次重写后的文件大小增长了 100%,则再次触发重写
auto-aof-rewrite-percentage 100 

此外,还可以通过 bgrewriteaof 命令,手动触发重写。AOF 重写也是通过 fork 子进程完成,对 Redis 主线程没有多大影响。

RDB 与 AOF 对比

RDB AOF 文件大小 小 大 优先级 低 高 恢复速度 快 慢 数据安全 容易丢失数据 视策略而定

RDB 文件保存的是快照数据,在恢复数据上更快;而 AOF 在恢复数据的时候需要重放命令,相对较慢;

但 RDB 方式容易丢失数据,而 AOF 相对没那么容易丢失数据,因此 Redis 在重启的时候,会优先考虑使用 AOF 文件来恢复数据。

混合持久化

鉴于 RDB 与 AOF 各有优缺点,Redis 4.0 引入了混合持久化方式,同时集合了两者的优点。

开启 AOF 之后,可以通过以下配置开启混合持久化:

aof-use-rdb-preamble yes

开启该参数后,当 AOF 文件发生重写的时候,重写前的内存数据会以 RDB 格式保存在 appendonly.aof,而之后的增量命令,继续以 AOF 格式追加在 appendonly.aof 文件中。混合持久化形式的 AOF 文件结构如下:

混合持久化文件格式.jpg

混合持久化文件格式.jpg


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK