Redis持久化
1.Redis持久化
Redis有两种持久化方案:
- RDB持久化
- AOF持久化
1.1.RDB
RDB全称Redis Database Backup file(Redis数据备份文件),RDB其实就是把数据以快照的形式保存在磁盘上。什么是快照呢,你可以理解成把当前时刻的数据拍成一张照片保存下来。
RDB持久化是指在指定的时间间隔内将内存中的数据集快照写入磁盘。也是默认的持久化方式,这种方式是就是将内存中数据以快照的方式写入到二进制文件中,默认的文件名为dump.rdb。
1.1.1.RDB执行
RDB持久化在四种情况下会执行:
- 执行save命令
- 执行bgsave命令
- Redis停机时
- 触发RDB条件时
1)save命令
save命令会导致主进程执行RDB,这个过程中其它所有命令都会被阻塞。
2)bgsave命令
bgsave命令执行后Redis执行fork操作创建子进程完成RDB,主进程可以继续处理用户请求,不会阻塞。
3)停机时
Redis停机时会执行一次save命令,实现RDB持久化。
4)触发RDB条件
Redis内部有触发RDB的机制,可以在redis.conf文件中找到,格式如下:
# 下面的配置代表600秒内如果至少有10个key被修改,则执行bgsave
save 600 10
RDB的其它配置也可以在redis.conf文件中设置:
# 是否进行压缩(会耗费cpu资源)
rdbcompression yes
# RDB文件保存名称(默认为dump.rdb)
dbfilename dump.rdb
1.1.2.RDB原理
bgsave开始时会fork主进程得到子进程,子进程共享主进程的内存数据。完成fork后读取内存数据并写入 RDB 文件。
fork采用的是copy-on-write技术:
- 当主进程执行读操作时,访问共享内存;
- 当主进程执行写操作时,则会拷贝一份数据,执行写操作。
1.2.AOF
1.2.1.AOF原理
AOF全称为Append Only File(追加文件)。Redis处理的每一个写命令都会记录在AOF文件,可以看做是命令日志文件。
1.2.2.AOF配置
AOF默认是关闭的,需要修改redis.conf配置文件来开启AOF:
# 是否开启AOF功能,默认是no
appendonly yes
AOF的命令记录的频率也可以通过redis.conf文件来配:
# 每执行一次写命令,立即记录
appendfsync always
# 每隔1秒将缓冲区数据写到AOF文件(默认)
appendfsync everysec
# 由操作系统决定何时将缓冲区内容写回磁盘
appendfsync no
三种策略对比:
1.2.3.AOF文件重写
AOF的方式也同时带来了另一个问题。持久化文件会变的越来越大。为了压缩aof的持久化文件。redis提供了bgrewriteaof命令。将内存中的数据以命令的方式保存到临时文件中,同时会fork出一条新进程来将文件重写。
Redis也会在触发阈值时自动去重写AOF文件。阈值也可以在redis.conf中配置:
# AOF文件相比上次增长超过多少百分比则触发bgrewriteaof
auto-aof-rewrite-percentage 100
# AOF文件达到一定大小触发bgrewriteaof
auto-aof-rewrite-min-size 64mb
重写aof文件的操作,并没有读取旧的aof文件,而是将整个内存中的数据库内容用命令的方式重写了一个新的aof文件,这点和快照有点类似。
1.3.RDB与AOF对比
RDB和AOF各有优缺点,在实际开发中一般会结合两者来使用。