Redis数据持久化——RDB快照和Aof日志追加
Redis数据持久化
数据持久化:将内存中的数据保存到磁盘中。
作用:让Redis服务重启后可以恢复之前的数据。
一、Redis数据持久化的方式:
·RDB(快照):
将内存中Redis缓存的所有数据,都以二进制字符串的方式保存为一个.rdb文件。
特点:占用存储小;当恢复所有数据时,速度快。(恢复某一段数据比较慢,意外宕机还可能丢失几分钟的数据)不建议频繁生成快照。
·AOF(日志追加):
将每次增、删、改的操作添加到.aof日志中,默认明文存储(可压缩),占据更大的存储空间,保存数据时,运行资源占用少。追加日志可以实时添加。
对比维度 | RDB(快照) | AOF(日志) |
核心原理 | 定时生成内存全量数据的二进制快照 | 实时追加每一条写指令到文本日志 |
文件格式 | 二进制文件(.rdb),体积小 | 文本文件(.aof),体积大(重写前) |
数据安全性 | 安全性低:间隔快照,可能丢失“快照后-宕机前”的数据 | 安全性高:支持每秒/实时刷盘,最多丢失1秒数据 |
恢复速度 | 快:直接解析二进制数据到内存 | 慢:需重新执行所有写指令 |
性能影响(运行时 | 低:仅fork子进程时短暂阻塞,后续无影响 | 中/高:刷盘频繁(如everysec/always),I/O开销大 |
性能影响(恢复时 | 快:适合大规模数据恢复 | 慢:数据量越大,恢复时间越长 |
触发方式 | 自动(save配置)、手动(save/bgsave) | 自动(刷盘策略)、手动(bgrewriteaof重写) |
适用场景 | 非核心数据、备份/灾备、可接受数据丢失的场景 | 核心数据、需高安全性(如金融、交易)的场景 |
默认开启 | 是(默认持久化方案) | 否(手动配置appendonlyyes) |
二、RDB持久化触发机制
触发RDB持久化过程分为手动触发和自动触发
2.1、手动触发:通过 Redis 命令主动生成 RDB:
save:主进程直接执行 RDB,期间会阻塞所有客户端请求(不推荐生产环境,适用于小型数据集);
bgsave:后台保存,主进程 fork 子进程执行 RDB,主进程不阻塞(生产环境首选)。
2.2、自动触发
自动触发持久化,本质是 Redis 通过判断,如果满足设置的触发条件,自动执行一次 bgsave 命令。
通过 redis.conf 配置 “时间 - 修改次数” 规则,满足条件时自动执行 RDB,示例配置:
# 规则格式:save <秒数> <修改次数>
save 900 1 # 900秒内(15分钟)至少1次数据修改,触发RDB
save 300 10 # 300秒内(5分钟)至少10次数据修改,触发RDB
save 60 10000 # 60秒内至少10000次数据修改,触发RDB
当设置多个 save m n 命令时,满足任意一个条件都会触发持久化。
若需禁用自动 RDB,可注释所有 save 配置,或添加 save ""
三、RDB持久化配置
3.1、配置文件
vim /etc/redis/redis.conf
#RDB持久化自动触发条件
save 900 1
save 300 10
save 60 10000
#bgsave持久化失败,是否停止持久化数据到磁盘,yes 表示停止持久化,no 表示忽略错误继续写文件
stop-writes-on-bgsave-error yes
#rdb文件是否压缩
rdbcompression yes
#写入文件和读取文件时是否开启rdb文件检查,检查是否有无损坏,如果在启动是检查发现损坏,则停止启动。
rdbchecksum yes
#rdb持久化后存放的文件名
dbfilename dump.rdb
#rdb持久化后文件的存放路径
dir ./
注意:
文件压缩要是开启的话:Redis 会采用 LZF 算法进行压缩。如果不想消耗 CPU 性能来进行文件压缩的话,可以设置为关闭此功能,这样的缺点是需要更多的磁盘空间来保存文件。
3.2、配置查询/设置
config get xxx
127.0.0.1:6379> config get dir
1) "dir"
2) "/usr/local/redis"
127.0.0.1:6379> config get dbfilename
1) "dbfilename"
2) "dump.rdb"
127.0.0.1:6379> config get stop-writes-on-bgsave-error
1) "stop-writes-on-bgsave-error"
2) "yes"
config set xxx
[root@zuolaoshi /]# cd /usr/local/redis
[root@zuolaoshi redis]# ./bin/redis-cli
127.0.0.1:6379> config set dir "/usr/local/redis/data"
OK
127.0.0.1:6379> config get dir
1) "dir"
2) "/usr/local/redis/data"
注意:
使用命令修改的方式,马上生效,在 Redis 重启之后就会丢失。手动修改 Redis 配置文件,想要立即生效需要重启 Redis 服务器,会一直有效。
3.3、禁用持久化
127.0.0.1:6379> config set save ""
OK
3.4、RDB文件恢复
当 Redis 服务器启动时,Redis 就会自动加载 RDB 文件恢复持久化数据。
验证加载
启动redis时
image20200229014938758.png
四、RDB持久化案例
4.1、手动持久化
127.0.0.1:6379> config set save ""
OK
127.0.0.1:6379> set s helloworld!
OK
127.0.0.1:6379> get s
"helloworld!"
127.0.0.1:6379> save
OK
127.0.0.1:6379> del s
(integer) 1
127.0.0.1:6379> get s
(nil)
127.0.0.1:6379> exit
[root@zuolaoshi redis]# ./bin/redis-cli shutdown
[root@zuolaoshi redis]# ./bin/redis-server /etc/redis/redis.conf
#Redis服务端启动成功提示信息
[root@zuolaoshi redis]# ./bin/redis-cli
127.0.0.1:6379> get s
"helloworld!"
4.2、自动持久化案例
#新建log文件夹
[root@zuolaoshi redis]# mkdir log
#配置日志文件
[root@zuolaoshi redis]# vim redis.conf
#配置:logfile "/usr/local/redis/log/redis.log"
[root@zuolaoshi redis]# ./bin/redis-server /etc/redis/redis.conf
[root@zuolaoshi redis]# ./bin/redis-cli
127.0.0.1:6379> config set save "10 1"
OK
127.0.0.1:6379> config get save
1) "save"
2) "10 1"
127.0.0.1:6379> set a 123
OK
127.0.0.1:6379> set b 456
OK
127.0.0.1:6379> set c 789
OK
127.0.0.1:6379> set d 8910
OK
127.0.0.1:6379> exit
[root@zuolaoshi redis]# cd log
[root@zuolaoshi log]# ls
redis.log
[root@zuolaoshi log]# vim redis.log
image20200229024640021.png
五、AOF持久化
AOF方式在使用Redis存储非临时数据时,一般都需要打开AOF持久化来降低进程终止导致的数据丢失,AOF可以将Redis执行的每一条写命令追加到硬盘文件中,这一过程显然会降低Redis的性能,但是大部分情况下这个影响是可以接受的,另外,使用较快的硬盘能提高AOF的性能。
5.1、AOF工作流
命令写入 (append)、文件同步(sync)、文件重写(rewrite)、重启加载 (load)
image20200303224156711.png
5.2、AOF特点
默认文件名是 appendonly.aof。保存的位置由配置中 dir 来配置目录。
AOF 每次都会保存写命令,数据实时性更高。
AOF 需要使用“重写机制”来优化,每次记录写命令,文件会很大的问题。
AOF 根据不同的“缓冲区同步策略”将我们缓冲区中写入的命令,同步到磁盘。
重写机制
image20200303233558568.png
缓冲区同步策略
设置appendfsync 控制,一共3种:
always:客户端的每一个写操作都保存到aof文件当,这种策略很安全,但是每个写都会有IO操作,所以也很慢。
everysec:每秒写入一次aof文件,因此,最多可能会丢失1s的数据。 推荐使用这种方式。
no: 交由操作系统来处理什么时候写入aof文件。更快,但也是最不安全的选择,不推荐使用。
5.3、持久化恢复
在重启redis服务时,rdb与aof如何执行?
image20200303235441014.png
六、开启AOF持久化
6.1、修改配置
修改配置文件/usr/local/redis/redis.conf
appendonly yes #表示开启AOF持久化,默认是no表示关闭
appendfilename "appendonly.aof" #AOF持久化文件名
appendfsync everysec #缓冲同步策略,默认值
no-appendfsync-on-rewrite no #是否重写,默认不重写