RDB持久化
1:redis中RDB持久化方式也叫快照方式是redis的默认持久化方式,当符合一定条件时redis会对当前数据库中所有的数据生成一份快照文件并保存到磁盘中。
2:redis.conf中有两个参数dbfilename和dir分别指定了rdb文件的名称和保存路径。默认文件名dump.rdb是一个二进制文件,默认保存路径./当前目录。
3:redis启动时会在当前目录下加载dump.rdb文件,然后使用此文件恢复数据。这就是我们在不同目录下启动redis会发现数据丢失的原因。当然我们也可以更改dir的配置让它指定一个绝对目录。
4:RDB持久化触发条件和关闭
save 900 1 到900秒后发现至少一个key被修改
save 300 10 到900秒后发现至少10个key被修改
save 60 10000 到60秒后发现至少10000个key被修改
以上三个条件任意一个满足则启动持久化,另外我们也可以根据业务来自行设定持久化触发条件。
注释掉触发条件新增一个配置save “” 就会关闭RDB功能,但是如果在redis-cli中手动执行save或bgsave命令会生成dump.rdb文件执行持久化。
5:RDB原理
当开始持久化时redis会调用一个fork函数复制当前进程生成一个子进程,子进程就会将当前数据库中所有的数据写入一个临时文件,写完后替换dump.rdb文件。这样保证随时都有可用的dump.rdb文件,避免直接写dump文件时服务器宕机导致dump文件不可用。
6:save和bgsave
在redis-cli中提供两个命令来手动执行持久化。
save指定当前进程执行持久化,在此过程中当前进程不会再去执行用户的读写操作。
bgsave会复制子进程执行持久化。
7:redis-check-dump
执行redis-check-dump dump.rdb命令会对dump文件执行简单的检查和修复。
以下是执行后输出
==== Processed 8valid opcodes (in 268 bytes) ==================================
CRC64 checksumis OK
AOF持久化
1:Redis中可以通过日志文件进行持久化,此种方式叫AOF。AOF默认不开启它和RDB没有关系,两种持久化方式可以独立存在或结合使用。
2:redis.conf中有appendonly,appendfilename,dir参数
appendonly默认值是no即不开启AOF,我们可以改为yes然后重启redis即可启动AOF持久化方式。
appendfilename指定AOF日志文件的名称默认是appendonly.aof,此文件可以通过more命令查看。
dir指定AOF文件的存放路径,默认./当前路径这个和RDB一样。
3:AOF持久化触发条件
在redis.conf文件中有三个参数用来控制在什么条件下执行AOF持久化
#appendfsyncalways 每次写操作时写入日志,此种方式一定不会丢数据但是会影响性能。
appendfsynceverysec 每一秒就会写入日志是默认方式,但是会存在丢失数据的风险。
# appendfsync no 不主动写日志,由操作系统执行写入,每30秒执行一次。
4:appendonly.aof
所有的写操作都会写入appendonly.aof日志文件,但是AOF是通过追加的方式写入而RDB则是全量写入。
我在redis中执行set a 1和set a 2两次操作再通过more命令查看日志文件,下面显示的是aof日志文件内容。
*3
$3
set
$1
a
$1
1
*3
$3
set
$1
a
$1
2
日志文件中记录的每一个写操作信息都是以*开头的
*3表示此命令有3个参数即set a 1
$3表示命令中参数的长度set为3
5:日志重写
在上面的例子中我们执行了两个写操作(seta 1和set a 2)对应的日志文件中就存入了两次部分信息,但是实际上第二次记录的键a的值才有意义,这样就会造成一个冗余问题,日志文件会很大。
Redis通过日志文件重写来解决这个问题。
重写时redis会记录当前内存中数据的状态然后生成新的日志文件再替换掉旧的日志文件,从而解决冗余问题。
在redis.conf中有两个参数定义了重写的触发条件
auto-aof-rewrite-percentage100 当前的日志文件超过上一次重写时日志文件大小百分之多少时触发,这里是100%
auto-aof-rewrite-min-size64mb 日志达到64m时执行
在redis-cli中执行bgrewrite命令手动触发
6:动态切换
如果AOF和RDB方式共存那么redis会认为AOF保存的日志文件最完整,启动时会默认选择通过日志文件来恢复数据,这样有可能会丢失RDB保存的数据。
下面的步骤可以保证切换到AOF后不会丢失RDB数据
首先在redis-cli中执行如下命令
config set appendonlyyes 动态开启AOF
config set save “” 关闭RBD
先执行这两个命令使AOF同步当前数据但是在重启redis后之前的修改会失效,所以还需要修改redis.conf文件使AOF生效,最后重启redis即可完成切换操作。
7:redis-check-aofappendonly.aof 执行简单的检查和修复