1.RDB策略

RDB策略是redis的默认持久化机制,相当于照快照,适用于内存充裕的计算机。RDB策略会创建一个后缀名为.rdb的文件,如果.rdb文件已经存在,服务器在执行RDB持久化时,会用新的.rdb文件去替换旧的.rdb文件

redis的持久化:RDB和AOF

RDB持久化功能可以将服务器包含的所有数据库中的数据以二进制文件的形式保存到硬盘中,如下图所示:

redis的持久化:RDB和AOF

在服务器启动时载入RDB文件,服务器根据RDB文件的内容,还原RDB文件中的数据,如下图所示:

redis的持久化:RDB和AOF

1.1 使用方式

可以使用下面三种方式,让redis执行RDB持久化:

1、服务器执行客户端发送的SAVE命令(阻塞当前服务,无法接收客户端请求)

2、服务器执行客户端发送的BGSAVE命令(非阻塞命令,创建子进程去执行)

3、在redis.conf中当save配置选项设置的自动保存条件满足时,服务器自动执行BGSAVE(最常用的)

1.2 SAVE和BGSAVE的区别

执行SAVE命令,会立即创建.rdb文件,但redis服务器将被阻塞,无法处理客户端的请求,只有在SAVE命令执行完毕之后(也是.rdb文件创建完毕后),服务器,才会重新开始处理客户端发送的命令请求;

执行BGSAVE命令,服务器会创建子进程,由子进程去完成RDB持久化,所以BGSAVE命令是非阻塞的,但是会消耗额外的内存,所以SAVE创建RDB文件的速度会比BGSAVE快;

啥时候使用SAVE啥时候使用BGSAVE,没有绝对的标准,例如:如果数据库正在上线,那就不该阻塞,得使用BGSAVE;如果数据库正在维护,此时系统阻塞了也没差,使用SAVE会更快一点

1.3 自动RDB配置

SAVE和BGSAVE都需要手动执行,还有一种方式是redis自动执行,满足redis.conf指定的条件即可触发,一般在以下两种情况:

①服务器正常关闭的时候,会进行一次快照

②key满足一定条件会进行一次快照,那么是满足何种条件?由配置文件redis.conf来决定,当任意一个条件被满足时,就会执行

  redis的持久化:RDB和AOF

save 900 1 :若距离上次创建.rdb文件已过去900秒,且服务器所有数据库的key总共已发生≥1次的修改,将会自动执行BGSAVE命令。同理,"save 300 10" 和 "save 60 10000"也是一样的道理,只要满足这三种条件的任意一种,就会自动执行RDB持久化。

PS:

redis的持久化:RDB和AOF  

1.4 RDB缺点

①RDB持久有一个缺点,那就是创建RDB文件需要将服务器所有数据库的数据保存起来,这是一个非常耗费资源和时间的操作,所以服务器需要隔一段时间才创建一个新的RDB文件,也就是说,创建RDB文件的操作不能执行得过于频繁,否则就会严重影响服务器的性能

②RDB策略要间隔一段时间后,才会自动保存数据,在执行了多条命令,由于隔间时间没到,redis不会执行持久化,如果此时停电了或者系统宕机了,则这些命令就全部丢失

1.5 RDB文件

redis的持久化:RDB和AOF

最上面代表redis的所有数据库,如:db0、db1...

中间的代表单个数据库打开后的所有key,如kv0、kv1...

最下面代表单个key的信息,如:超时时间、值的类型、key对应的value

2.AOF策略

适用于内存比较小的计算机,相当于使用日志功能来保存数据的操作,默认AOF配置是关闭的。每当数据库有"用于修改的命令"被执行时,服务器就会把该命令写入到AOF文件的末尾。因为AOF文件里面储存了服务器执行过的所有数据库"用于修改的命令",所以给定一个AOF文件,服务只要重新执行一遍AOF文件里面包含的所有命令,就可以达到还原数据库的目的。PS:AOF只会保存导致key变化的语句。

redis的持久化:RDB和AOF

2.1 AOF配置

AOF有3种配置:

always:服务器每写入一个命令,就调用一次fdatasync,将缓冲区里面的命令写入到硬盘,这种方式速度最慢,但最安全;

everysec:服务器每一秒调用一次fdatasync,将缓冲区的命令写入到硬盘,这种方式速度折中,安全性也折中,默认配置;

no:服务器不主动调用fdatasync,由操作系统决定什么时候将缓冲区里面的命令写入到硬盘(linux 默认是30秒将缓冲区的数据回写硬盘)这种方式速度最快,安全性最差。

怎么配置?

1、首先AOF默认是被关闭的,需要手动开启:

   修改redis.conf的配置,找到appendonly,把no修改为yes

redis的持久化:RDB和AOF

2、配置AOF的保存策略(appendfsync):可以看到默认是每秒保存的策略

redis的持久化:RDB和AOF

2.2 重写策略

随着服务器的不断运行,服务器会将越来越多的命令写入到AOF文件中,导致AOF文件的体积不断的增大。为了让AOF文件的大小控制在合理的范围,避免无限制地增大,redis提供了AOF重写功能,通过这个功能,服务器可以产生一个新的AOF文件。重写实际上就是重新处理命令,将命令合并。

          redis的持久化:RDB和AOF

有两种方式触发AOF重写:

1、客户端向服务器发送BGREWRITEAOF命令

2、配置让服务器自动执行BGREWRITEAOF命令:

   auto-aof-rewirite-min-size 64mb,这行配置的意思是当AOF文件的体积≥size时,服务器才会考虑是否需要进行AOF重写,同时也避免了对体积过小的AOF文件进行重写,默认是64mb;

   auto-aof-rewrite-percentage 100,这行配置的意思是当对一个AOF文件进行重写后,仅当它增长率大于100%,才会继续对它重写。比如,有一个64mb的AOF文件,符合size要求,对它重写,重写后size=60mb,下次要对它进行重写,需要它的体积达到120mb。

redis的持久化:RDB和AOF

相关文章: