先说明一下相关的配置
#redis日志文件
logfile "/usr/local/redis/log/redis.log"
#是否开启aof
appendonly yes
#aof文件名称
appendfilename "appendonly.aof"
#每一条命令都追加到aof文件
# appendfsync always
#每分钟追加一次到aof文件
appendfsync everysec
#根据操作系统确定什么时候追加到aof文件(不可控)
# appendfsync no
#aof重写的时候是否不追加到aof
no-appendfsync-on-rewrite no
#aof自动重写的增长率(简单说就是上一次自动重写的大小比如是90M,那么100就代表下次重写会在180M的时候重写)
auto-aof-rewrite-percentage 100
#aof自动重写的最小尺寸(大小)
auto-aof-rewrite-min-size 64mb
#redis在使用aof恢复时是否忽略错误,如果为no发现错误就会停止,必须修复后才能重新加载。
aof-load-truncated yes
#是否开启rdb-aof混合持久化方式,Redis4.0 以上才有的功能
aof-use-rdb-preamble no
#aof文件存放的路径
dir /usr/local/redis/data/
生成aof文件
在开启 appendonly yes 的时候启动 redis时就会生成aof 文件,然后根据配置的策略
这里我配置的是appendfsync everysec 每秒写入aof
查看一下 aof文件
vim /usr/local/redis/data/appendonly.aof
*2
$6
SELECT
$1
0
*3 //*3 代表该命令有3个参数 set name hello 总共3个参数
$3 //$3 代表该参数有3个字符 set 就是3个字符
set
$4
name
$5
hello
*3
$3
set
$4
name
$4
test
*2
$4
incr
$3
num
*2
$4
incr
$3
num
*2
$4
incr
$3
num
*3
$5
lpush
$5
queue
$1
1
*3
$5
lpush
$5
queue
$1
2
*3
$5
lpush
$5
queue
$1
3
可以看到,每隔一秒就会写入执行的命令。
也可以看到该文件有很多无效数据,有的数据也可以简化
接来下我们通过bgrewriteaof命令去重写 aof 文件
通过日志文件可以看出重写成功
再来打开aof文件看一看
*2
$6
SELECT
$1
0
*5
$5
RPUSH
$5
queue
$1
3
$1
2
$1
1
*3
$3
SET
$3
num
$1
3
*3
$3
SET
$4
name
$4
test
可以看到 简化了很多。比如 name 最终的值是test ,那么 set name hello 这条就没了,
lpush queue 1
lpush queue 2
lpush queue 3
这三条命令也简化成 rpush queue 3 2 1 这一条命令了
自动重写就会根据配置
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
去完成自动重写aof
aof重写跟rdb的bgsave一样 都会启动一个子进程去完成对应的文件写入