一文搞明白Redis中两种持久化机制RDB和AOF
redis两种持久化类型
1.redis两种持久化操作
redis支持两种方式的持久化,一种是RDB方式,一种是AOF方式,这两种方式可以单独使用其中一种,也可以混合使用
如果不使用持久化,那么当redis重启后,所有的数据会全部消失
redis重启前是有很多key的
当redis重启后,所有key全部消失
1.1.RDB方式
RDB方式就类似于快照,当符合一定条件的数据,Redis会自动将内存中的所有数据打一个快照,并存储到磁盘上,主要有两个参数构成,时间和改动,比如在1分钟内如果产生了1000个key,那么就打一个快照,RDB是redis的默认持久化方式
redis启动后会读取RDB快照文件,将数据从硬盘载入到内存,一般情况下1G的快照文件载入到内存的时间大约是20-30s
RDB持久化优缺点:
可以在指定的时间间隔内生成数据集的时间点快照
优点:速度快,适合用作备份,主从复制也是基于RDB持久化功能实现的
缺点:会有数据丢失
RDB持久化原理:
1.当rdb条件满足时,redis会调用系统函数fork(),创建一个子进程进行持久化
2.子进程将数据集写入到一个临时的rdb文件中,当子进程完成对临时rdb文件的写入时,redis用新的rdb文件替换原来旧的rdb文件,并将旧的rdb文件删除
在执行fork的时候操作系统会使用写时复制策略,即函数发送的一刻,父子进程共享同一个内存数据,当父进程要更改其中某片数据时,操作系统会将该片数据复制一份以保证子进程的数据不受影响,所以新的rdb文件存储的是执行for那一刻的内存数据
Redis在进行快照的过程中不会修改RDB文件,只有快照结束后才会将旧的文件替换成新的,也就是说任何时候RDB文件都是完整的。这使得我们可以通过定时备份RDB文件来实 现Redis数据库备份。RDB文件是经过压缩(可以配置rdbcompression参数以禁用压缩节省CPU占用)的二进制格式,所以占用的空间会小于内存中的数据大小,更加利于传输
除了自动快照,还可以手动发送SAVE或BGSAVE命令让Redis执行快照,两个命令的区别在于,前者是由主进程进行快照操作,会阻塞住其他请求,后者会通过fork子进程进行快照操作。
1.2.AOF方式
AOF会记录服务器执行的所有写操作命令,并在服务器启动时,通过重新执行这些命令来还原数据集
AOF的特点就是记录服务器运行过程中产生的所有命令,如果有del命令,当aof文件的大小达到限制时,会触发内部的一个压缩命令,将del命令删除以及del之前创建的key一并从文件中删除,当服务器再次启动时,重新执行这些命令来还原数据
AOF文件中的命令全部以redis协议的格式来保存,新命令会被追加到文件的末尾
优点:可以最大程度保证数据不丢失
缺点:日志记录量级比较大
RDB持久化有时候不生效,生成环境中建议使用AOF来做持久化,两者也可以并存
2.redis持久化配置操作
2.1.RDB持久化操作
RDB持久化不是实时保存redis数据的,也是需要一个过程
2.1.1.配置RDB持久化
注意:redis配置文件不能在参数后面加任何注释,否则会不生效
1.配置rdb持久化
[root@redis-1 ~]# vim /data/redis_cluster/redis_6379/conf/redis_6379.conf
dbfilename redis_6379.rdb #指定本地持久化文件的文件名,默认dump.rdb
dir /data/redis_cluster/redis_6379/data #本地数据库的目录,rdb文件路径
save 900 1 //900秒(15分钟)内有1个更改
save 300 100 //300秒(5分钟)内有100个更改
save 60 10000 //60秒(1分钟)内有10000个更改
2.重启redis
[root@redis-1 ~]# redis-cli
127.0.0.1:6379> shutdown
[root@redis-1 ~]# redis-server /data/redis_cluster/redis_6379/conf/redis_6379.conf
2.1.2.批量创建key并观察rdb文件是否创建
批量创建key
[root@redis-1 ~]# for i in {1..15000}
do
redis-cli set k_${i} v_${i}
echo "k_${i} is ok"
观察rdb文件是否产生
[root@redis-1 ~]# ll /data/redis_cluster/redis_6379/data/redis_6379.rdb
-rw-r--r--. 1 root root 148006 1月 28 14:39 /data/redis_cluster/redis_6379/data/redis_6379.rdb
2.1.3.关闭redis验证持久化是否生效
1.查看key并关闭redis,关闭redis的时候一定要大于缓存设定的数据,否则会不生效,
[root@redis-1 ~]# redis-cli
127.0.0.1:6379> DBSIZE
(integer) 15000
127.0.0.1:6379>
127.0.0.1:6379> shutdown
2.再次启动redis查看key,数据还是存在的
[root@redis-1 ~]# redis-server /data/redis_cluster/redis_6379/conf/redis_6379.conf
[root@redis-1 ~]# redis-cli dbsize
(integer) 16000
3.rdb有时会生成不了持久化文件,我们可以使用bgsave命令手动持久化
[root@redis-1 ~]# redis-cli
127.0.0.1:6379> BGSAVE
Background saving started
127.0.0.1:6379> SHUTDOWN
not connected> exit
.再次启动redis查看数据有没有丢失
[root@redis-1 ~]# redis-cli
127.0.0.1:6379> DBSIZE
(integer) 16000
2.2.AOF持久化操作
2.2.1.配置AOF持久化
注意:配置AOF时不能有注释存在
1.配置aof
[root@redis-1 ~]# vim /data/redis_cluster/redis_6379/conf/redis_6379.conf
dir /data/redis_cluster/redis_6379/data/ //持久化文件路径
appendonly yes //是否打开aof日志功能
appendfilename "appendonly.aof" //aof文件名称
appendfsync always //每执行一个命令都立即同步到aof持久化文件
appendfsync everysec //每秒写入1次
appendfsync no //写入功能交给操作系统,由操作系统判断缓冲区大小,统一写到aof
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb //aof文件大小,当超过设定的值就执行aof压缩命令
aof-load-truncated yes
2.启动redis
2.2.批量创建key并观察aof文件变化
1.批量生产key
[root@redis-1 ~]# for i in {1..15000}
do
redis-cli set k_${i} v_${i}
echo "k_${i} is ok"
done
2.观察aof文件的,会持续增长,redis每执行一个命令都会记录到aof中
[root@redis-1 ~]# cd /data/redis_cluster/redis_6379/data
[root@redis-1 /data/redis_cluster/redis_6379/data]# ll appendonly.aof
-rw-r--r--. 1 root root 257031 1月 28 14:02 appendonly.aof
[root@redis-1 /data/redis_cluster/redis_6379/data]# ll appendonly.aof
-rw-r--r--. 1 root root 266836 1月 28 14:02 appendonly.aof
[root@redis-1 /data/redis_cluster/redis_6379/data]# ll appendonly.aof
-rw-r--r--. 1 root root 272571 1月 28 14:02 appendonly.aof
[root@redis-1 /data/redis_cluster/redis_6379/data]# ll appendonly.aof
-rw-r--r--. 1 root root 277566 1月 28 14:02 appendonly.aof
2.2.3.重启redis查看数据是否会丢失
1.关闭redis
[root@redis-1 ~]# redis-cli
127.0.0.1:6379> SHUTDOWN
2.启动redis
[root@redis-1 ~]# redis-server /data/redis_cluster/redis_6379/conf/redis_6379.conf
3.查看数据是否丢失,还是15000个key,数据全部都在
[root@redis-1 ~]# redis-cli
127.0.0.1:6379> DBSIZE
(integer) 15000
2.2.4.观察aof持久化文件
aof文件会记录redis的所有更改命令
删除、新增key都会记录在aof文件中,当redis重启后,会将aof文件中的命令还原到redis中,从而保证数据的持久化,我们配置的aof文件大小为64m,默认就是64m,当文件超过64m时,redis有自己的压缩策略,会把aof中的删除命令全部删掉,保证文件的大小,也可以根据实际生产把文件大小给大
3.redis持久化隐藏技能
3.1.redis支持热更新配置
redis中某些配置也是支持热更新的,只需要在命令行执行命令即可加载配置
查看配置:config get *
配置参数:config set 配置
查看当前redis的所有配置
127.0.0.1:6379> CONFIG GET *
1) "dbfilename"
2) "redis_6379.rdb"
3) "requirepass"
4) ""
5) "masterauth"
6) ""
7) "unixsocket"
8) ""
9) "logfile"
10) "/data/redis_cluster/redis_6379/logs/redis_6379.log"
11) "pidfile"
··························
查看redis的rdb配置
127.0.0.1:6379> CONFIG GET save
1) "save"
2) "900 1 300 100 60 10000"
rdb配置时支持热更新的
1.将rdb的配置取消
127.0.0.1:6379> CONFIG SET save ""
OK
127.0.0.1:6379> CONFIG GET save
1) "save"
2) ""
2.配置rdb
127.0.0.1:6379> CONFIG SET save "60 10000 300 100 900 1"
OK
127.0.0.1:6379> CONFIG GET save
1) "save"
2) "60 10000 300 100 900 1"
3.2.rdb和aof同时使用
结论:rdb和aof同时存在,redis每次启动读取的是aof持久化文件而不是rdb持久化文件
1.将rdb文件清空
[root@redis-1 ~]# > /data/redis_cluster/redis_6379/data/redis_6379.rdb
2.重启redis
[root@redis-1 ~]# redis-cli shutdown
[root@redis-1 ~]# redis-server /data/redis_cluster/redis_6379/conf/redis_6379.conf
3.redis还是有数据的
[root@redis-1 ~]# redis-cli dbsize
(integer) 16000
1.将aof文件清空,rdb文件保存
[root@redis-1 ~]# ll /data/redis_cluster/redis_6379/data/redis_6379.rdb
-rw-r--r--. 1 root root 249870 1月 28 14:53 /data/redis_cluster/redis_6379/data/redis_6379.rdb
[root@redis-1 ~]# > /data/redis_cluster/redis_6379/data/appendonly.aof
[root@redis-1 ~]# ll /data/redis_cluster/redis_6379/data/appendonly.aof
-rw-r--r--. 1 root root 0 1月 28 14:53 /data/redis_cluster/redis_6379/data/appendonly.aof
2.重启redis
[root@redis-1 ~]# redis-cli shutdown
[root@redis-1 ~]# redis-server /data/redis_cluster/redis_6379/conf/redis_6379.conf
3.查看数据发现已经清空
[root@redis-1 ~]# redis-cli dbsize
(integer) 0
3.3.redis shutdown命令
redis配置了rdb持久化之后,使用shutdown关闭redis时,系统首先执行bgsave,将数据保存到持久化文件,再执行shutdown,这样就做到了数据的持久化
目录 返回
首页