Redis数据持久化:RDB 与 AOF 对比解析




一、RDB (Redis DataBase)

1、简介

redis 定期保存数据快照到一个 dump.rdb 文件中,并在启动时自动加载 dump.rdb 文件恢复旧数据。


2、使用方法

RDB 触发机制分为使用指令手动触发和 redis.conf 配置自动触发。

2,1 手动触发 Redis 进行 RDB 持久化的指令的为:

save ,该指令会阻塞当前 Redis 服务器,执行 save 指令期间,Redis 不能处理其他命令,直到 RDB 过程完成为止。
bgsave,执行该命令时,Redis 会在后台异步执行快照操作,此时 Redis 仍然可以相应客户端请求。

具体操作是 Redis 进程执行 fork 操作创建子进程,RDB 持久化过程由子进程负责,完成后自动结束。
Redis 只会在 fork 期间发生阻塞,但是一般时间都很短。
但是如果 Redis 数据量特别大, fork 时间就会变长,而且占用内存会加倍,这一点需要特别注意。

2.2 自动触发 RDB 的默认配置如下所示:

save 900 1 # 表示900 秒内如果至少有 1 个 key 的值变化,则触发RDB
save 300 10 # 表示300 秒内如果至少有 10 个 key 的值变化,则触发RDB
save 60 10000 # 表示60 秒内如果至少有 10000 个 key 的值变化,则触发RDB

2.3 如果不需要 Redis 进行持久化
可以注释掉所有的 save 行来停用保存功能,也可以直接一个空字符串来停用持久化:save “”。

Redis 服务器周期操作函数 serverCron 默认每个 100 毫秒就会执行一次;
该函数用于正在运行的服务器进行维护,
它的一项工作就是检查 save 选项所设置的条件是否有一项被满足,如果满足的话,就执行 bgsave 指令。


3、如何处理过期数据 ?

3,1 生成 RDB 文件时:
redis 会检查保存的数据是否过期,如果过期则不会写入 RDB 文件;

3,2 载入 RDB 文件时:
redis 会对 RDB 文件中的数据进行过期检查,已过期的数据会被忽略,不写入内存。


4、dump.rdb 文件怎么查看 ?

#/usr/local/python/bin/rdb   --help
Usage: rdb [options] /path/to/dump.rdb
Example : rdb --command json -k "user.*" /var/redis/6379/dump.rdb

Options:
  -h, --help            show this help message and exit
  -c FILE, --command=FILE
                        要执行的命令json 或 diff
  -f FILE, --file=FILE  输出文件名
  -n DBS, --db=DBS      数据库ID。可以提供多个数据库。如果没有指定,包含所有数据库。
  -k KEYS, --key=KEYS   导出键。可以是正则表达式。
  -t TYPES, --type=TYPES
                        数据类型。可能的值有:string, hash, set, sortedset, list。 可以提供多个类型。如果没有指定,所有数据类型都返回。

比如解析 dump.rdb 文件并以 JSON 格式标准输出:

/usr/local/python/bin/rdb --command json  dump.rdb

或者 只解析符合正则的 keys

/usr/local/python/bin/rdb --command json --key "test.*"  dump.rdb

rdb工具的安装方法可参考:redis-rdb-tools来解析分析reids dump文件及内存使用量


5、RDB 优点

5.1 性能影响最小 ,Redis 在保存 RDB 快照时会 fork 出子进程进行,几乎不影响 Redis 处理客户端请求的效率;

5.2 每次快照会生成一个完整的数据快照文件,
所以可以辅以其他手段保存多个时间点的快照(比如通过crontab每天备份到特定地方),作为可靠的灾难恢复手段。

5.3 使用 RDB 文件进行数据恢复比使用 AOF 要快很多。


6、RDB 缺点

6.1 快照是定期生成的,所以在 Redis crash 时或多或少会丢失一部分数据。

6.2 如果数据集非常大且 CPU 不够强,Redis 在 fork 子进程时可能会消耗相对较长的时间,从而影响 Redis 对外提供服务的能力。

6.3 dump.rdb 文件不是直接可读的,需要借助其他工具转换格式才可读。




二、AOF(Append Only File)

1、简介

Redis 会把每一个写请求都记录在一个日志文件里。
在 Redis 重启时,会把 AOF 文件中记录的所有写操作顺序执行一遍,确保数据恢复到最新。


2、使用方法

在 redis.conf 配置开启:

appendonly yes
appendfilename "appendonly.aof"
appendfsync everysec
//AOF提供了三种fsync配置,always/everysec/no
//appendfsync no:不进行fsync,将flush文件的时机交给OS决定,速度最快
//appendfsync always:每写入一条日志就进行一次fsync操作,数据安全性最高,但速度最慢
//appendfsync everysec:折中的做法,交由后台线程每秒fsync一次

3、如何处理过期数据?

3.1 AOF 文件写入时:
如果数据库中的某个键已过期,但它还没被删除,那么 AOF 文件不会因为这个键产生任何影响。当它被惰性删除或者定期删除之后,程序会向 AOF 文件追加一条 DEL 命令显式记录该键已被删除。

3.2 AOF 载入重写时:
和生成 RDB 文件一样,会过滤掉已经过期的键。


4、appendonly.aof 文件如何查看 ?

appendonly.aof 默认是可读的,
直接 cat appendonly.aof 即可查看。


5、AOF 优点

5.1 安全,在启用 appendfsync always时,任何已写入的数据都不会丢失,使用在启用appendfsync everysec 也至多只会丢失1秒的数据。

5.2 AOF 文件在发生断电等问题时也不会损坏,即使出现了某条日志只写入了一半的情况,也可以使用redis-check-aof工具轻松修复。

5.3 AOF 文件易读,可修改,在进行了某些错误的数据清除操作后,只要 AOF 文件没有 rewrite,就可以把 AOF 文件备份出来,把错误的命令删除,然后恢复数据。


6、AOF 缺点

6.1 AOF 文件通常比 RDB 文件更大;

6.2 性能消耗比 RDB 高;

6.3 数据恢复速度比 RDB 慢。




参考文档: 聊聊redis数据持久化

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值