持久化
Redis的高性能是由于其将所有数据都存储在了内存中,但由于记录在内存中的所有数据在系统断电之后就
会丢失,为了使Redis在重启之后仍能保证数据不丢失,需要将数据从内存中同步到硬盘中,这一过程就是
持久化。
Redis提供了三种持久化方式,分别是RDB持久化方式、AOF持久化方式和RDB-AOF混合持久化。
DR蜡士
1 RDB模式
RDB (Redis DataBase)持久化是Redis默认使用的持久化功能,该功能可以创建出一个经过压缩的二进制
文件,其中包含了数据库中所有的数据信息。这种方式生成的数据文件也叫快照(snapshotting)文件,该
文件以.rdb后缀结尾,默认会在redis的启动目录下生成该文件。
Redis默认:在哪启动redis,在哪生成持久化文件。

Redis提供了三种生成RDB文件的方法:
- SAVE:阻塞服务器并创建RDB文件
用户通过执行SAVE命令,要求服务器创建出一个记录了服务器当前所有数据的RDB文件。在SAVE命令执
行期间,,Redis服务器将被阻塞,无法对外提供服务,直到RDB文件创建完毕为止,所以不建议使用,尤
其是生产环境慎用。
127.0.0.1:6379> save
оK
- BGSAVE:以非阻塞方式创建RDB文件
用户通过执行BGSAVE命令,Redis会创建出一个子进程进行创建RDB文件,此时Redis服务器仍然可以对外
提供服务。
127.0.0.1:6379> bgsave
Background saving started
- 通过配置选项自动创建RDB文件
除了手动执行命令外,还可以通过设置参数,让服务器在满足条件时自动执行BGSAVE命令。需要在
redis.conf配置文件中默认有此下配置:
save 900 1
save 300 10
save 60 10000
save <seconds> <changes>接收seconds和changes两个参数,
前者用于指定触发持久化操作所需的时长,后者用于指定触发持久化操作所需要的修改次数。
比如,save 900 1表示900秒钟内进行了一次修改则执行一次BGSAVE命令。
Redis启动后会读取RDB快照文件,将数据从硬盘载入到内存。根据数据量大小与结构和服务器性能不同,
这个时间也不同。通常将记录一千万个字符串类型键、大小为1GB的快照文件载入到内存中需要花费20 30秒钟
RDB持久化存在的缺陷
- 停机时服务器丢失的数据量将取决于创建RDB文件的时间间隔:间隔越长,停机时丢失的数据也就越
多。 - RDB持久化是一种全量持久化操作,数据库中的数据量越大消耗的计算资源和内存资源越多,时间越
久。
2 AOF模式
与全量式的RDB持久化功能不同,AOF (Append Only File)提供的是增量式的持久功能。这种持久化的核
心原理在于:服务器每次执行完写命令之后,默认每秒钟都会将被执行的命令追加到AOF文件的末尾。
AOF文件的保存位置和RDB文件的默认存储位置相同,都是在Redis的安装路径下,默认文件名称为:appendonly.aof

默认情况下Redis没有开启AOF方式的持久化,需要通过appendonly参数开启:
appendonly yes
强制重写AOF文件
> bgrewriteaof
AOF持久化存在的缺陷
- AOF文件存储的命令比较多,通常比RDB文件大得多。
- 恢复数据时AOF需要通过执行AOF中的命令来恢复数据,所花费的时间就更多。而RDB恢复数据时属
于直接恢复,速度更快。
概括:
- RDB保存的数据的当前值,AOF保存的是所有的执行过的命令。
- RDB文件更精简,AOF文件会有很多无用数据。
- RDB可能丢失的数据更多,AOF可能丢失的数据更少。
如果有一条数据age为1,经过了一百次修改,修改为了age为100,那么RDB和AOF的存储数据为:

3 RDB-AOF混合持久化方式(推荐)
Redis 4.0之后新增的方式,混合持久化是结合了RDB和AOF的优点,在写入的时候,先把当前的数据
以RDB的形式写入文件的开头,再将后续的操作命令以AOF的格式存入文件,这样既能保证Redis重 启时的速度,又能减低数据丢失的风险。

开启混合持久化需要做两步:
- 开启AOF持久化方式
appendonly yes
- 开启混合持久化方式
查询是否开启了混合持久化可以使用config get aof-use-rdb-preamble命令,执行结果
127.0.0.1:6379> config get aof-use-rdb-preamble
1) "aof-use-rdb-preamble"
2) "yes"
其中yes表示已经开启混合持久化,no表示关闭,Redis 5.0默认值为yes。如果是其他版本的Redis首先需
要检查一下,是否已经开启了混合持久化,如果关闭的情况下,可以通过以下两种方式开启:
- 通过命令行开启
- 通过修改Redis配置文件开启
① 通过命令开启
使用命令config set aof-use-rdb-preamble yes
命令行设置配置的缺点是重启Redis服务之后,设置的配置就会失效。
② 通过修改Redis配置文件开启
在Redis的配置文件redis.conf文件,把配置文件中的aof-use-rdb-preamble no改为aof-use-rdb- oreamble yes
配置完成之后,需要重启Redis服务器,配置才能生效,但修改配置文件的方式,在每次重启Redis服务之
后,配置信息不会丢失。
如果AOF文件过大时候,会自动重写AOF:把当前数据以RDB格式保存,后续指令用AOF。当然也可以
通过命令BGREWRITEAOF来强制服务器重写AOF文件。
评论区