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 #是否重写,默认不重写

相关推荐
两年半的个人练习生^_^13 小时前
JMM 进阶:彻底理解 CAS 实现原理
java·开发语言
wuminyu13 小时前
Java锁机制之park和unpark源码剖析
java·linux·c语言·jvm·c++
x***r15113 小时前
Redis Desktop Manager 0.8.8 安装教程(Windows redis-desktop-manager-0.8.8.384详细步骤)
数据库·windows·redis
initialize130613 小时前
Postgresql(Oracle兼容) 到Oracle19.9字符语义
数据库·oracle
W_LuYi18513 小时前
手撸极简zkEVM验证器:RISC-V电路实践
java·risc-v
AI人工智能+电脑小能手13 小时前
【大白话说Java面试题 第102题】【并发篇】第2题:volatile 能否保证线程安全?
java·安全·面试
KobeSacre13 小时前
JUC 概述
java·开发语言
稷下元歌13 小时前
七天学会plc 加机器视觉完整笔记:S7-1200 数据类型、存储区与寻址方式(I/Q/M/DB 详解)。
网络·数据库·笔记
潮起鲸落入海14 小时前
mysql 5.x源码安装
数据库·mysql
小bo波14 小时前
形式化方法 × UML
java·软件工程·uml·面向对象·形式化方法·tla+