Redis简单介绍(3)-持久化的实现

持久化的定义

因为Redis是将数据存放在内存中的, 而内存中的数据是容易丢失的,使用持久化可以有效地避免因进程退出造成数据丢失问题, 当下次重启时利⽤之前持久化的⽂件即可实现数据恢复

使用"RDB"持久化

RDB全称"Redis Data Bases", RDB 持久化是把当前进程数据⽣成快照 以二进制的数据形式保存到硬盘的过程,触发 RDB 持久化过程分为⼿动触发和⾃动触发。RDB文件的说明:RDB文件是Redis将内存中的数据写入硬盘中,而生成的文件, 当Redis重启时, 它就会自动读取RDB文件里的数据到内存中.

自动触发

Redis 运行自动触发 RDB 持久化机制,这个触发机制才是在实战中有价值的。
1. 打开redis客户端的配置文件修改save 配置。如 "save m n" 表示 m 秒内数据集发生了 n 次修改,自动 RDB 持久化。
2. 从节点进行全量复制操作时,主节点自动进行 RDB 持久化,随后将 RDB 文件内容发送给从结点。
3. 执行 shutdown 命令关闭 Redis 时,执行 RDB 持久化

手动触发

1.使用''save"命令

用户在客户端输入"save"命令, 阻塞立即当前 Redis 服务器,直到 RDB 过程完成为⽌,但对于内存⽐较⼤的数据会造成⻓时间的阻塞,所以基本不采⽤。注意:save是直接将数据写入原来的RDB文件中

2.使用"bgsave"命令

用户在客户端输入"bgsave"命令, 此时RDB过程的原理图如下:

bgsave的使用原理是利用"多进程"的方式进行写入硬盘.步骤大致如下:

  1. 输入bgsave后系统会判断需要写入数据的''父进程''是否有子进程.如果有则返回子进程
    如果没有则利用Linux系统特有的"fork"指令创建一个与父进程完全一致的子进程(子进程的信息功能,数据和父进程完全一致,可以做到和父进程一样的操作)
  2. 然后子进程就会执行数据写入操作,生成对应的RDB文件, 而父进程会继续执行后续用户的其他命令
  3. 当数据写入完毕时,子进程会通知父进程. 父进程得到通知后将相关信息进行复制并销毁子进程

注意:bgsave是创建一个新的RDB文件并将数据写入,之后用新的文件去替换旧的RDB文件

使用RDB的持久化的优缺点

优点

• Redis 加载 RDB 恢复数据远远快于 AOF 的⽅式

• RDB 是⼀个紧凑压缩的⼆进制⽂件,代表 Redis 在某个时间点上的数据快照。⾮常适⽤于备份,全 量复制等场景。⽐如每 6 ⼩时执⾏ bgsave 备份,并把 RDB ⽂件复制到远程机器或者⽂件系统中 (如 hdfs)⽤于灾备
缺点
• RDB ⽅式数据没办法做到实时持久化 / 秒级持久化。因为 bgsave 每次运⾏都要执⾏ fork 创建⼦进程,属于重量级操作,频繁执⾏成本过⾼。
• RDB ⽂件使⽤特定⼆进制格式保存,Redis 版本演进过程中有多个 RDB 版本,兼容性可能有⻛ 险。

使用"AOF"持久化

AOF全称(Append Only File),它的持久化原理是:将用户对Redis的操作命令全部记录下来放到文件中, 当服务器重启时, 就会再执行一遍,这样就恢复了之前的数据.

这种做法做到了实时存储 , 而且一旦配置中开启了AOF持久化那么Redis则默认使用AOF持久化

AOF的工作流程

AOF的工作流程分为:命令写入, 文件同步 和 AOF文件重写

1.命令写入

AOF写入数据的方式是以文本形式写入文件中, 并且命令会先写入缓冲区中, 并由缓冲区一次性将命令写入到文件中.

2.文件同步

缓冲区内的数据写入文件中的时机 可以在客户端的配置文件中修改,可修改的值如下:

always:将一个命令写入aof_buf的缓冲区中, 之后立即将缓冲区的命令写到文件中

everysec:将命令写入aof_buf的缓冲区中, 不会立即写到文件中, 而是过一秒之后再写入文件中

no:将命令写入aof_buf时, 不会主动写入文件中, 而是交给操作系统决定何时写入文件

3.AOF文件重写

文件重写也就是更新文件中的内容, AOF的文件重写机制与RDB的机制类似都是利用**"多进程"**

1: 如果当前进程正在执行 AOF 重写,请求不执行。如果当前进程正在执行 bgsave 操作,重写命令延迟到 bgsave 完成之后再执行。

2: 没有子进程就会用系统的"fork"命令复制一个一样的进程作为子进程, 子进程可以执行和父进程一样的操作

3.1:父进程会执行后续的命令,将后续命令写到缓冲区中, 并同步到旧的AOF文件中. (这样做是为了子进程意外中断, 导致所有数据都未保存,此时旧的文件依然保存了一些数据)

3.2:父进程执行后续的命令的同时会将新的命令写入aof_rewrite_buf中, 让子进程将新的命令追加到新的AOF文件中

4:子进程会创建一个新的AOF文件并将命令写入

5.1:写入完成后通知父进程

5.2:父进程把 AOF重写缓冲区内临时保存的命令追加到新 AOF文件中。

5.3:将新 AOF 文件替换旧的AOF文件。

混合持久化

混合持久化是指:

Redis的混合持久化结合了RDB(快照)和AOF(日志)两种持久化方式的优点,在性能、数据安全性和恢复效率上取得了平衡。AOF文件中每次最后追加的内容是文本形式,但之前的数据以二进制的形式存在

这种方式的好处是:降低了文件的硬盘空间的占用量

相关推荐
952362 小时前
MyBatis
后端·spring·mybatis
FQNmxDG4S4 小时前
Java多线程编程:Thread与Runnable的并发控制
java·开发语言
虹科网络安全4 小时前
艾体宝干货|数据复制详解:类型、原理与适用场景
java·开发语言·数据库
axng pmje5 小时前
Java语法进阶
java·开发语言·jvm
rKWP8gKv75 小时前
Java微服务性能监控:Prometheus与Grafana集成方案
java·微服务·prometheus
老前端的功夫5 小时前
【Java从入门到入土】28:Stream API:告别for循环的新时代
java·开发语言·python
qq_435287925 小时前
第9章 夸父逐日与后羿射日:死循环与进程终止?十个太阳同时值班的并行冲突
java·开发语言·git·死循环·进程终止·并行冲突·夸父逐日
小江的记录本5 小时前
【Kafka核心】架构模型:Producer、Broker、Consumer、Consumer Group、Topic、Partition、Replica
java·数据库·分布式·后端·搜索引擎·架构·kafka
yaoxin5211236 小时前
397. Java 文件操作基础 - 创建常规文件与临时文件
java·开发语言·python
极客先躯8 小时前
高级java每日一道面试题-2025年11月24日-容器与虚拟化题[Dockerj]-runc 的作用是什么?
java·oci 的命令行工具·最小可用·无守护进程·完全标准·创建容器的核心流程·runc 核心职责思维导图