从零学习redis(3)--- AOF持久化
redis 刘宇帅 6年前 阅读量: 1200
AOF 持久化是 Redis 提供的另外一种持久化方案,AOF 持久化是将发送到服务端的每一条命令记录下来,并且保存在硬盘的 AOF 文件中。AOF 默认是关闭的,可以通过修改 redis.conf 中相应的配置启动。
appendonly yes # 启动 AOF 持久化,默认是 no
appendfilename "appendonly.aof" # AOF 文件文件名
文件同步策略
文件的写入默认情况下会先写入系统的缓存中,系统每隔30秒同步一次,才是真正的写入磁盘,如果这30秒服务器宕机那数据也会丢失。
Redis 可以通过 redis.conf 中的配置设置同步策略
# appendfsync always 每次都同步(最安全但是最慢)
appendfsync everysec 每秒同步(默认的同步策略)
# appendfsync no 不主动同步,由操作系统来决定(最快但是不安全)
AOF 文件重写
因为 AOF 持久化是保存了被执行的 Redis 命令来记录数据库状态的,所以随着时间流失,AOF 文件内容会越来越多,文件越来越大,这样不禁会占用较多的存储空间,同时也使数据恢复进行的时候速度受到限制。所以 Redis 添加 AOF 文件重写,AOF 文件的重写(会在fork一个子进程完成)并不会读取当前的 AOF 文件,去整理历史的命令,而是根据当前服务器数据状态生成一份 AOF 文件。 我们可以在命令行使用BGREWRITEAOF 命令重写 AOF 文件,同时 Redis 服务器也会根据 Redis 配置文件执行重写策略。
auto-aof-rewrite-percentage 100 # 当前的AOF文件大小超过上一次重写的AOF文件大小的百分之多少时会再次进行重写,如果之前没有重写过,则以启动时的AOF大小为依据。
auto-aof-rewrite-min-size 64mb # 限制了允许重写的最小AOF文件,通常在AOF文件很小的时候即使其中有些冗余命令也可是可以忽略的。
AOF 测试
重新启动一个redis,并添加几个值
127.0.0.1:6379> keys *
(empty list or set)
127.0.0.1:6379> set user:1 shuai
OK
127.0.0.1:6379> set user:2 shuai
OK
127.0.0.1:6379> set user:3 shuai
OK
127.0.0.1:6379> keys *
1) "user:3"
2) "user:2"
3) "user:1"
127.0.0.1:6379> get user:1
"shuai"
我们查看appendonly.aof
*2
$6
SELECT
$1
0
*3
$3
set
$6
user:1
$5
shuai
*3
$3
set
$6
user:2
$5
shuai
*3
$3
set
$6
user:3
$5
shuai
cat查看appendonly.aof 已经将 Redis 命令协议的 \r\n 转义成了换行。
我们修改 Redis 服务器里的值
127.0.0.1:6379> set user:1 bushuai
OK
127.0.0.1:6379> set user:2 bushuai
OK
127.0.0.1:6379> set user:3 bushuai
OK
在查看 AOF 文件内容
*2
$6
SELECT
$1
0
*3
$3
set
$6
user:1
$5
shuai
*3
$3
set
$6
user:2
$5
shuai
*3
$3
set
$6
user:3
$5
shuai
*3
$3
set
$6
user:1
$7
bushuai
*3
$3
set
$6
user:2
$7
bushuai
*3
$3
set
$6
user:3
$7
bushuai
很显然,AOF 文件把所有的命令都追加到了 AOF 文件后面。那么我们执行 AOF 重写命令
127.0.0.1:6379> BGREWRITEAOF
Background append only file rewriting started
在次查看 AOF 文件内容
*2
$6
SELECT
$1
0
*3
$3
SET
$6
user:3
$7
bushuai
*3
$3
SET
$6
user:2
$7
bushuai
*3
$3
SET
$6
user:1
$7
bushuai
显然,AOF 文件里保存的命令正是能恢复redis数据的最简单命令集。
这个时候我们可以在服务器上同时看到appendonly.aof 和 dump.rdb 文件,我们重启redis并查看启动日志。
1:M 17 Oct 07:12:26.054 * DB loaded from append only file: 0.000 seconds
1:M 17 Oct 07:12:26.055 * Ready to accept connections
在 redis 的启动日志里我们可以看到 Redis 是从 AOF 文件里恢复的数据。