欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Redis的持久化方案—学习笔记

程序员文章站 2022-07-05 10:58:36
...

Redis提供了三种持久化方案,RDB、AOF以及两种混合使用。

RDB

Redis Data Base, Redis可以用SAVE或者BGSAVE命令来创建.rdb文件将数据持久化到磁盘上,或者根据用户配置策略来触发持久化操作。

SAVE命令

Redis服务器阻塞执行持久化操作,期间不再响应外部请求。这种一般用户系统停机维护的场景。

BGSAVE命令

Redis服务器后台执行一个fork操作创建一个子进程用于后台执行持久化操作。
因为Linux内核下的copy-on-write机制的存在,子进程不用拷贝父进程的内存中的所有数据。

BGSAVE命令配置文件策略执行
save 900 1 
save 300 10
save 60 10000

那么当以下任意一个条件被满足时,服务器就会执行一次BGSAVE命令

  • 在900s(15min)之内,服务器对数据库执行了至少1次修改。
  • 在300s(5min)之内,服务器对数据库执行了至少10次修改。
  • 在60s(1min)之内,服务器对数据库执行了至少10000次修改。
关闭RDB持久化
save ""

AOF

Append Only File。AOF持久化的核心原理在于:服务器每次执行完改变数据的命令之后,该命令都会以协议文本的方式追加到AOF文件的末尾。

AOF配置

在配置文件中默认为不打开这种持久化方式,通过这个配置项打开,关闭的话改为no即可:

appendonly yes

通过下面的方式选择数据刷盘方式:

# appendfsync always
appendfsync everysec
# appendfsync no

我们知道,我们向磁盘写数据的时候,一般是先写入一个内核缓冲区,由操作系统内核在合适的时机刷盘。上面几个选项就是控制什么时候由缓冲区刷新到磁盘的。

appendfsync always即每执行一条改变数据的操作后就立即向磁盘写入记录,这样做会大大降低Redis的性能,一般不推荐。

appendfsync no即由操作系统内核决定什么时候把数据由内核缓冲区刷进磁盘,我们不管。这里的风险就是如果操作系统异常宕机,这时候内核缓冲区的数据就丢失了,并且丢失多少是不可控的。

appendfsync everysec即每过一秒就向磁盘刷一次缓冲区中的数据,这样的话即使操作系统发生异常掉电一类的错误我们也最多丢失一秒内的数据。

AOF文件是以redis请求协议的文本保存的。
例如我们在客户端执行set key1 hello

*2  # Redis默认后台先执行 select 0,这个命令两个参数,select 和 0,所以第一行是*2
$6  # 这里表示命令选项的长度6
SELECT
$1  # 这里表示命令选项的长度1
0
*3  # 这里同前面,命令是3个参数, set、key1和hello
$3  # 选项长度3
set
$4  # 选项长度4
key1
$5  #选项长度5
hello

因为AOF只会追加命令,如果Redis反复对一个键进行修改操作,AOF文件中就会有很多重复记录。随着运行时间越长,AOF文件就会越来越大。Redis提供了AOF文件重写功能来减少冗余命令。

我们可以手动调用BGREWRITEAOF命令来主动触发AOF文件重写。它是一个异步命令,创建子进程扫描整个数据库生成AOF文件,代替老的AOF文件。

有两个配置选项来控制什么时候触发AOF重写:

auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb

auto-aof-rewrite-min-size触发自动AOF文件重写所需的最小AOF文件体积,当AOF文件的体积小于这个值时,服务器将不会自动执行BGREWRITEAOF命令。

auto-aof-rewrite-percentage控制触发自动AOF文件重写所需的文件体积增大比例。如果当前AOF文件的体积比最后一次AOF文件重写之后的体积增大了一倍(100%),那么将自动执行一次BGREWRITEAOF命令。如果Redis服务器刚刚启动,还没有执行过AOF文件重写操作,那么启动服务器时使用的AOF文件的体积将被用作最后一次AOF文件重写的体积。

AOF与RDB混合方式

RDB的缺陷在于,这次数据快照开始后在下一次快照完成之前,期间如果系统崩溃,那么期间会存在数据丢失的情况。

AOF的缺陷在于,AOF体积比较大,如果Redis重启过后恢复数据到内存是需要一定时间的。

这样的情况下,RDB-AOF混合模式就应运而生,在Redis4.0版本过后就支持使用这种混合模式。

开启混合模式
aof-use-rdb-preamble yes

aof-use-rdb-preamble配置选项为yes时,Redis服务器在执行AOF重写操作时,就会根据Redis当前的内存数据生成出相应的RDB数据,并将这些数据写入新建的AOF文件中,至于那些在AOF重写开始之后执行的Redis命令,则会继续以协议文本的方式追加到新AOF文件的末尾,即AOF文件中已有的RDB数据的后面。