目录
更多精彩博文详见:
Redis是内存数据库,数据直接存放在内存中,所以读写效率非常高。但这种方式也存在一个很大的问题:一旦服务器断电或者宕机,数据将全部丢失。为了解决这个问题,Redis提供了持久化机制。Redis持久化机制可以把内存数据持久化到硬盘,同时也可以通过备份文件来恢复数据。
Redis支持三种持久化方式:RDB快照持久化、AOF日志持久化、混合持久化。其中混合持久化是Redis 4.0开始增加的持久化选项。
一、RDB快照持久化
RDB快照持久化是按照指定的时间间隔对数据进行快照,将数据保存在数据文件中。RDB快照触发方式有手动触发和自动触发两种。快照触发后,数据默认写入dump.rdb文件,该文件名称通过Redis配置文件的dbfilename选项指定。
RDB快照方式无法做到实时或者秒级持久化。
(一)、手动触发RDB快照持久化
手动触发RDB快照持久化是通过在Redis客户端命令行工具上人为执行持久化备份命令完成的。
1、save命令
执行save命令会在前台进行快照备份。save命令执行时会调用rdbSave函数,函数调用后立即启动持久化流程。由于Redis是单线程,在执行save命令进行快照备份的过程中,Redis无法对外提供服务。
- 执行save命令
root@dataTest \~\]# /data/redis/redis_6379/src/redis-cli 127.0.0.1:6379\> save  * **查看dump.rdb文件** \[root@dataTest \~\]# ll /data/redis/data/  dump.rdb文件的存放路径通过Redis配置文件的dir选项指定,此处为/data/redis/data
2、bgsave命令
执行bgsave命令会在后台进行快照备份。bgsave命令执行时会调用rdbSaveBackground函数,该函数会fork出子进程,子进程负责调用rdbSave函数执行持久化流程,而主进程会继续对外提供服务。
- 执行bgsave命令
root@dataTest \~\]# /data/redis/redis_6379/src/redis-cli 127.0.0.1:6379\> bgsave  * **查看dump.rdb文件** \[root@dataTest \~\]# ll /data/redis/data/  dump.rdb文件的存放路径通过Redis配置文件的dir选项指定,此处为/data/redis/data
(二)、自动触发RDB快照持久化
自动触发RDB快照持久化流程,通常有下面三个场景:
- Redis配置文件中"save m n"规则的设置。如"save 300 10",表示300秒(5分钟)内至少有10个key的值发生变化,则执行持久化流程。其中save ""表示关闭RDB持久化。
- Redis主从复制。当从节点第一次连接主节点时,主节点会触发RDB持久化,并将rdb文件发送给从节点,进而完成主从复制的初始化。
- 未开启其他持久化机制(如未开启AOF日志持久化)的情况下,当执行shutdown命令关闭Redis服务时,Redis会默认执行bgsave操作。
例如Redis配置文件中的配置:
save "" 表示关闭RDB持久化。
二、AOF日志持久化
AOF(Append Only File)日志持久化是将Redis执行过的所有写操作记录下来(读操作不记录),并以追加的方式写在日志文件中。日志文件由Redis配置文件中的appendfilename选项设置,默认为"appendonly.aof"。
当Redis服务重启时,会按顺序重新执行日志文件中记录的指令内容,从而完成数据的恢复工作。AOF日志重放的过程相对于RDB快照来说要慢很多,在AOF日志文件较大的情况下,数据恢复、Redis服务启动需要花费较长的时间。
Redis执行写操作时,不会立即写入AOF文件,而是将写操作先保存在AOF缓存区,再根据写入策略把所有写操作保存在AOF文件中。
随着AOF文件内容的增加,AOF会根据对应的规则进行写操作命令的合并(重写),从而起到压缩AOF文件的目的,避免了文件过大。

(一)、开启AOF日志持久化
1、开启AOF日志持久化
Redis默认情况下是关闭AOF日志持久化功能的,需要修改如下配置开启功能。
- **appendonly:**yes代表开启AOF,no代表关闭AOF。
2、配置AOF文件名称
AOF文件的默认名称为appendonly.aof,可以根据实际需求修改文件名称。
- **appendfilename:**默认文件名称为appendonly.aof,该文件存放在dir配置项配置的路径下,此处为/data/redis/data
(二)、设置AOF写入策略
AOF会根据写入策略,将AOF缓冲区的写操作持久化到AOF文件中。
- **appendfsync:**默认的写入策略是everysec,即每秒写入。
appendfsync配置项对比如下:
|--------------|----------|---------------|------------|
| 配置项 | 写入时机 | 优点 | 缺点 |
| always | 立即写入磁盘 | 强持久化,数据基本不丢失。 | 性能影响较大 |
| everysec(默认) | 每秒写入一次磁盘 | 性能适中 | 宕机时丢失一秒的数据 |
| no | 操作系统控制写入 | 性能较佳 | 宕机时损失数据较多 |
(三)、配置AOF文件重写规则
随着Redis写操作的增加,AOF文件将会越来越大。需要配置策略定期对AOF文件进行重写,避免AOF文件过大导致性能问题。
AOF重写规则主要由以下配置完成:
- **auto-aof-rewrite-percentage:**默认设置为100,即当AOF文件增长了100%时,AOF开始重写。
- **auto-aof-rewrite-min-size:**默认设置为64mb,即当文件超过64mb时,AOF开始重写。需要注意的是,若AOF的增长百分比超过了auto-aof-rewrite-percentage设置的值,但文件仍然小于64mb时,AOF不会重写。
(四)、重启Redis服务
root@dataTest \~\]# /data/redis/redis_6379/src/redis-server /data/redis/redis_6379/redis.conf \[root@dataTest \~\]# netstat -tnlp \[root@dataTest \~\]# ll /data/redis/data/  由上可见,重启Redis服务后,服务创建了appendonly.aof文件,说明AOF日志持久化功能已经成功开启。
三、RDB+AOF混合持久化
Redis 4.0后新增了一个新的持久化模式-----RDB+AOF混合持久化。混合持久化模式使用RDB快照文件和RDB快照时间点之后的增量AOF日志文件进行数据恢复。恢复数据时先加载RDB快照文件,再重放增量AOF日志文件。这样即解决了使用RDB快照恢复数据时存在数据丢失的问题,又解决了使用AOF日志恢复数据时的性能问题。
开启RDB+AOF混合持久化
aof-use-rdb-preamble yes
更多精彩博文详见: