作者:Grey
原文地址:Redis学习笔记六:持久化实验(AOF,RDB)
Redis几种持久化方案介绍和对比
AOF方式:https://blog.csdn.net/ctwctw/article/details/105173842
RDB方式:https://blog.csdn.net/ctwctw/article/details/105265689
对比:https://blog.csdn.net/ctwctw/article/details/105147277
准备工作
安装Redis,可以参考Redis学习笔记一:安装和配置
AOF实验
如果按照准备工作中的方法安装的redis,找到配置文件,默认在如下位置
vi /etc/redis/6379.conf
修改这两个配置
appendonly yes
appendfsync always
# appendfsync everysec
# appendfsync no
打开always选项,仅为了实验用,生产环境慎用,或者用everysec。
配置好以后,可以通过
service redis_6379 restart
重启redis
然后查看一下redis的data目录,默认在如下位置:
ls /var/lib/redis/6379
显示了aof文件
[root@db01 6379]# ls /var/lib/redis/6379
appendonly.aof
通过redis-cli连上redis,执行一些命令
[root@db01 6379]# redis-cli
127.0.0.1:6379> mset k1 a k2 b k3 c k4 d
OK
127.0.0.1:6379> set k5 e
OK
127.0.0.1:6379> mget k1 k2 k3 k4 k5
1) "a"
2) "b"
3) "c"
4) "d"
5) "e"
模拟数据被摧毁操作,执行flushall
127.0.0.1:6379> flushall
OK
退出redis-cli客户端,查看aof文件内容
[root@db01 6379]# cat /var/lib/redis/6379/appendonly.aof
*2
$6
SELECT
$1
0
*9
$4
mset
$2
k1
$1
a
$2
k2
$1
b
$2
k3
$1
c
$2
k4
$1
d
*3
$3
set
$2
k5
$1
e
*1
$8
flushall
所有操作都被记录下来了,假设我们要恢复摧毁前的数据,我们可以这样操作,打开aof文件,并把最后一行的flushall操作删除, 然后执行
redis-cli --pipe < /var/lib/redis/6379/appendonly.aof
重新连接redis,查看数据,全部恢复:
[root@db01 6379]# redis-cli
127.0.0.1:6379> mget k1 k2 k3 k4 k5
1) "a"
2) "b"
3) "c"
4) "d"
5) "e"
AOF的rewrite
假设我们执行:
127.0.0.1:6379> set k1 123
OK
127.0.0.1:6379> set k1 345
OK
127.0.0.1:6379> del k1
(integer) 1
127.0.0.1:6379> set k1 786
其实只需要保留最后一条执行结果即可,如果我们不开启rewrite, 那么aof文件内容会是这样:
[root@db01 6379]# cat appendonly.aof
*2
$6
SELECT
$1
0
*3
$3
set
$2
k1
$3
123
*3
$3
set
$2
k1
$3
345
*2
$3
del
$2
k1
*3
$3
set
$2
k1
$3
786
接下来我们开启rewrite,
连接redis-cli, 执行如下命令
127.0.0.1:6379> bgrewriteaof
Background append only file rewriting started
再次查看aof文件,变成了如下:
[root@db01 6379]# cat appendonly.aof
*2
$6
SELECT
$1
0
*3
$3
SET
$2
k1
$3
786
也可以通过配置两个参数来自动触发rewrite,具体参数为:
auto-aof-rewrite-min-size
auto-aof-rewrite-percentage
参数含义见官方文档,不赘述。
RDB实验
将aof方式先停用
vi /etc/redis/6379.conf
将这个配置改为no
appendonly no
删掉遗留的aof文件
rm -rf /var/lib/redis/6379/appendonly.aof
进入redis-cli,并清库
flushall
然后删掉dump.rdb文件
rm -rf /var/lib/redis/6379/dump.rdb
经过如上操作,redis目前数据为空,且备份文件也为空,关闭了aof策略,现在开始修改redis的配置文件,配置rdb的策略
vi /etc/redis/6379.conf
配置如下信息
# 60秒之内,至少有5个key发生变化,就触发rdb
save 60 5
# 默认的rdb文件名为:dump.rdb
dbfilename dump.rdb
# 默认rdb文件的位置
dir /var/lib/redis/6379
配置修改完毕
重启redis
重新连接redis-cli, 快速执行一些操作(一分钟之内至少set 5个key)
127.0.0.1:6379> set k1 a
OK
127.0.0.1:6379> set k2 b
OK
127.0.0.1:6379> set k3 c
OK
127.0.0.1:6379> set k4 5
OK
127.0.0.1:6379> set k5 dd
OK
127.0.0.1:6379> set k6 dasdfas
OK
127.0.0.1:6379> set k7 5sdfas
将生成的dump.rdb文件先重命名
mv /var/lib/redis/6379/dump.rdb /var/lib/redis/6379/dump.rdb.backup
重新连接redis-cli。模拟摧毁数据操作
flushall
停掉redis
service redis_6379 stop
将备份的dump文件重新还原
mv /var/lib/redis/6379/dump.rdb.backup /var/lib/redis/6379/dump.rdb
重新启动redis
service redis_6379 start
重新连接redis-cli,查看数据是否恢复
[root@db01 6379]# redis-cli
127.0.0.1:6379> keys *
1) "k1"
2) "k5"
3) "k2"
4) "k3"
5) "k6"
6) "k4"
7) "k7"
127.0.0.1:6379> mget k1 k2 k3 k4 k5 k6 k7
1) "a"
2) "b"
3) "c"
4) "5"
5) "dd"
6) "dasdfas"
7) "5sdfas"
如上,数据全部恢复。
混合方式
Redis 4.0 后持久化新增混合持久化,混合持久化指的是在开启后,将持久化文件同时以RDB格式和AOF格式 一块写入aof文件中,将aof重写的数据存入RDB中,在生成RDB中如果很大,则需要时间,那么这段时间客户端对redis的操作,将会追加写入aof文件,并且他们两个最后一块写入aof文件中
混合持久化性能更优秀,同时兼顾RDB 和AOF ,解决aof重启恢复慢,也同时进行AOF操作
修改配置文件
vi /etc/redis/6379.conf
配置如下几项
# 开启混合持久化
aof-use-rdb-preamble yes
# 默认是64mb,为了模拟效果,我临时改成0mb,这样的话,每次都会触发混合模式
auto-aof-rewrite-min-size 0mb
重启redis
重新连接redis-cli,快速执行一些操作,再一次查看aof文件
cat /var/lib/redis/6379/appendonly.aof