sunzxh 2020-07-05
博观而约取,厚积而薄发。
Redis持久化的方案有两种:
在指定的时间间隔内将内存中的数据集快照写入磁盘,也就是行话讲的Snapshot快照,它恢复时是将快照文件直接读到内存里。默认文件是dump.rdb,存储的是二进制数据
dump.rdb
文件数据如下:REDIS0009? redis-ver5.0.3? ?ctime??i?^used-mem??v ? aof-preamble???nameydongynum?dage??l?ES?Y
SAVE
:当SAVE
命令执行时,会阻塞Redis服务器进程,直到RDB文件创建完毕为止,在服务器进程阻塞期间,服务器不能处理任何命令请求,也就是客户端发送的所有命令请求都会被拒绝,只有在服务器执行完SAVE
命令、重新开始接受命令请求之后,客户端发送的命令才会被执行。127.0.0.1:6379> set name ydongy OK 127.0.0.1:6379> save OK 127.0.0.1:6379>
BGSAVE
:发送指令Redis会fork
一个子进程来进行持久化,会先将数据写入到一个临时文件中,待持久化过程都结束了,再用这个临时文件替换上次持久化好的文件。整个过程中,主进程是不进行任何IO操作的,可以继续接受客户端发送过来的指令。可以通过lastsave
命令获取最后一次成功执行快照的时间。127.0.0.1:6379> set age 22 OK 127.0.0.1:6379> BGSAVE Background saving started 127.0.0.1:6379> LASTSAVE (integer) 1593667361 127.0.0.1:6379>
注意:
flushall
或者flushdb
命令,也会产生dump.rdb文件,但里面是空的,无意义debug reload
:服务器运行过程中重启shutdown
:关闭服务器时。默认情况下执行shutdown命令时, 自动执行BGSAVE
(如果没有开启AOF持久化功能)dump.rdb
移动到 redis 安装目录并启动服务即可,Redis服务器会自动查找该文件,前提是在配置文件中某有更改文件目录以及名称当 Redis 需要保存 dump.rdb 文件时, 服务器执行以下操作:
dbfilename dump.rdb
:设置本地数据库文件名,默认值为 dump.rdb,一般设置dump-端口号.rdb
dir
:设置存储.rdb文件的路径,尽量保存在存储空间较大的目录 rdbcompression yes
:设置存储至本地数据库时是否压缩数据,默认为 yes,采用 LZF 压缩rdbchecksum yes
:设置是否进行RDB文件格式校验,该校验过程在写文件和读文件过程均进行,默认为开启状态save second changes
:满足限定时间范围内key的变化数量达到指定数量即进行持久化。second:监控时间范围,changes:监控key的变化量save 900 1
:表示900s发生1次修改save 300 10
:表示300s发生10次修改save 60 10000
:表示60s发生10000次修改优点
缺点
以日志的形式来记录每个写操作,将Redis执行过的所有写指令记录下来(读操作不记录),只许追加文件但不可以改写文件,redis启动之初会读取该文件重新构建数据,换言之,redis重启的话就根据日志文件的内容将写指令从前到后执行一次以完成数据的恢复工作。默认的存储文件为:appendonly.aof
appendonly.aof
文件数据如下:*2 $6 SELECT $1 0 *3 $3 # 表示set占3个字符长度 set $4 # 表示name(key)占4个字符长度 name $6 # 表示ydongy(value)占6个字符长度 ydongy *3 $3 set $3 # 表示age(key)占3个字符长度 age $2 # 表示20(value)占2个字符长度 20
always(每次)
:命令写入aof_buf后立即调用系统fsync操作同步到AOF文件,fsync完成后线程返回。这种情况下,每次写入操作均同步到AOF文件中,数据零误差,硬盘IO成为性能瓶颈,性能较低everysec(每秒)
:命令写入aof_buf后调用系统write操作,write完成后线程返回;fsync同步文件操作由专门的线程每秒调用一次,将缓存区中的指令同步到AOF文件中,数据准确性较高,性能较高。在系统突然宕机的情况下丢失1秒内的数据no(系统控制)
:命令写入aof_buf后调用系统write操作,不对AOF文件做fsync同步;同步由操作系统负责,通常同步周期为30秒。这种情况下,文件同步的时间不可控,且缓冲区中堆积的数据会很多,数据安全性无法保证。系统调用write和fsync说明:
启动
appendonly no
,改为yesappendfsync always|everysec|no
三个AOF写数据策略任意选择一个,appendfilename filename
AOF持久化文件名,默认文件名为appendonly.aof,建议配置为appendonly-端口号.aofdir
AOF持久化文件保存路径,与RDB持久化文件保持一致即可恢复
将有数据的aof文件复制一份保存到对应目录(config get dir),重启redis然后重新加载
修复
服务器可能在程序正在对 AOF 文件进行写入时停机, 如果停机造成了 AOF 文件出错(corrupt), 那么 Redis 在重启时会拒绝载入这个 AOF 文件, 从而确保数据的一致性不会被破坏。当发生这种情况时, 可以用以下方法来修复出错的 AOF 文件:
$ redis-check-aof –fix
随着命令不断写入AOF,文件会越来越大,为了解决这个问题,Redis引入了AOF重写机制压缩文件体积。 AOF文件重
写是将Redis进程内的数据转化为写命令同步到新AOF文件的过程。 简单说就是将对同一个数据的若干个条命令执行结
果转化成最终结果数据对应的指令进行记录,可以使用命令bgrewriteaof
127.0.0.1:6379> BGREWRITEAOF Background append only file rewriting started 127.0.0.1:6379>
del key
,get key1
都会被忽略掉。set key 1
,set key 2
,lpush list1 a
,lpush list1 2
,最终保存在aof文件中命令就只有set key 2
,lpush list1 a 2
RDB持久化方式能够在指定的时间间隔能对你的数据进行快照存储
AOF持久化方式记录每次对服务器写的操作,当服务器重启的时候会重新执行这些命令来恢复原始的数据,AOF命令以redis协议追加保存每次写的操作到文件末尾,Redis还能对AOF文件进行后台重写,使得AOF文件的体积不至于过大。
RDB与AOF的选择: