持久化
Redis的持久化方式:快照(snapshotting,RDB),只追加文件(append-only file,AOF)。
# 1 RDB持久化(快照持久化)
RDB持久化是将内存中的数据以快照的方式写进二进制文件中,默认的文件名为:dump.rdb。
快照持久化是Redis默认采用的持久化方式。
# 1.1 RDB持久化是怎么触发的?
RDB支持3种触发方式:save,bgsave,自动化。
# 1.1.1 save触发方式
该命令会阻塞redis服务器,命令执行期间redis不能执行其他命令,直到RDB过程结束。
# 1.1.2 bgsave触发方式
该命令不会阻塞redis服务器,命令执行期间redis还可以响应客户端需求。
具体过程是redis进程执行fork操作创建一个子进程,RDB持久化过程由该子进程负责,完成后自动结束。阻塞只发生在fork阶段,一般时间很短。Redis内部所有RDB操作基本上都是用bgsave命令。
# 1.1.3 自动触发方式
自动触发是由我们配置文件来完成的。在redis.conf配置文件中默认有此下配置:
save 900 1 #在900秒(15分钟)之后,如果至少有1个key发生变化,Redis就会自动触发bgsave命令创建快照。
save 300 10 #在300秒(5分钟)之后,如果至少有10个key发生变化,Redis就会自动触发bgsave命令创建快照。
save 60 10000 #在60秒(1分钟)之后,如果至少有10000个key发生变化,Redis就会自动触发bgsave命令创建快照。
# 1.2 RDB有什么优势和劣势?
# 1.2.1 RDB优势
1)RDB文件紧凑,全量备份,非常适合数据备份和灾难恢复。
2)RDB过程可通过子线程进行,不影响redis主线程。
3)恢复大数据集时,恢复速度比AOF恢复速度快。
# 1.2.1 RDB劣势
快照持久化期间修改的数据不会被保存,可能丢失数据。
# 2 AOF持久化(append-only file)
AOF的工作机制很简单,就是redis把每一个收到的写命令都追加保存到AOF文件中。
与快照持久化相比,AOF持久化 的实时性更好,因此已成为主流的持久化方案。
默认情况下Redis没有开启。
AOF(append only file)方式的持久化,可以通过appendonly参数开启: appendonly yes
# 2.1 AOF的持久化是怎么触发的?
在Redis的配置文件中存在三种不同的 AOF 持久化方式,它们分别是:
# 2.1.1 appendfsync always
每次有数据修改发生时都会写入AOF文件,这样会严重降低Redis的速度。
# 2.1.2 appendfsync everysec
异步操作,每秒钟同步一次数据到硬盘,如果1秒内宕机,有数据丢失。
# 2.1.3 appendfsync no
让操作系统决定何时进行同步。
# 2.2 AOF持久化3种触发方式的对比?
# 2.3 AOF方式什么时候会出现文件重写?
由于AOF方式会记录所有的写命令,对于同一份数据来说,AOF日志文件要比RDB快照文件更大。随着持久化文件越来越大,redis会fork出子线程来将文件进行重写。
重写AOF文件不会读取旧文件,而是将内存中的数据内容用命令的方式重写一个新的AOF文件。
# 2.4 AOF有什么优势和劣势?
# 2.4.1 AOF优势
1)AOF可以更好地保护数据不丢失,一般设置每隔1秒同步一次数据,所以最多丢失1秒的数据。
2)AOF日志文件每次写入数据都是追加,写入性能很高。
3)AOF可以后台操作,不影响客户端读写。
4)AOF非常适合针对误删等情况进行数据恢复。比如有人不小心执行了flushall命令清空了数据,可以通过删除AOF文件中最后一条flushall命令,再将AOF文件放回去,执行恢复操作,恢复所有数据。
# 2.4.2 AOF劣势
1)针对同一份数据,AOF日志文件通常比RDB快照文件大。
# 3 混合持久化
RDB和AOF的特点:
Redis 4.0 带来了一个新的持久化选项——混合持久化。
重启 Redis 时,我们很少使用 RDB来恢复内存状态,因为会丢失大量数据。我们通常使用 AOF 日志重放,但是重放 AOF 日志性能相对 RDB来说要慢很多,这样在 Redis 实例很大的情况下,启动需要花费很长的时间。
通过如下配置可以开启混合持久化(必须先开启aof):
#aof‐use‐rdb‐preambleyes
AOF在重写时,不再是单纯将内存数据转换为RESP命令写入AOF文件,而是将重写这一刻之前的内存做RDB快照处理,并且将RDB快照内容和增量的AOF修改内存数据的命令存在一起,都写入新的AOF文件,重写完新的AOF文件覆盖原有的AOF文件,完成新旧两个AOF文件的替换。
# 4 数据怎么恢复?
例: