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
-
"dir"
-
"/usr/local/redis"
127.0.0.1:6379> config get dbfilename
-
"dbfilename"
-
"dump.rdb"
127.0.0.1:6379> config get stop-writes-on-bgsave-error
-
"stop-writes-on-bgsave-error"
-
"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 #是否重写,默认不重写