- 浏览: 142336 次
文章分类
最新评论
RDB 持久化功能可以将 Redis 在某个时刻内存中的数据库状态保存到 RDB 磁盘文件里面,以免数据丢失。RDB 文件是一个经过压缩的二进制文件,通过该文件亦可还原生成 RDB 文件时的数据库状态。
RDB 持久化可以手动执行,也可根据服务器配置选项定期执行。
SAVE 和 BGSAVE 命令可以用于生成 RDB 文件。SAVE 命令会阻塞 Redis 服务器进程,直到 RDB 文件创建完毕,在阻塞期间,服务器会拒绝客户端的任何命令请求。而 BGSAVE 命令则会单独派生一个子进程来负责创建 RDB 文件,因此服务器进程可以继续处理命令请求。创建 RDB 文件的工作实际上是由底层的 rdbSave 函数来完成的,SAVE 和 BGSAVE 命令只是以不同的方式调用这个函数而已,这可以通过以下的伪代码表示。
虽然 Redis 在 BGSAVE 命令执行期间仍然可以继续处理客户端的命令请求,但是 SAVE、BGSAVE 和 BGREWRITEAOF 三个命令的处理方式却和平时有所不同。在 BGSAVE 命令执行期间,客户端发送的 SAVE 和 BGSAVE 命令都会被服务器拒绝,这主要是为了避免多个进程同时执行 rdbSave 函数,从而产生竞争条件。而 BGREWRITEAOF 命令在 BGSAVE 命令执行期间会被延迟,直到 BGSAVE 命令执行完毕后才会执行。反过来,如果 BGREWRITEAOF 命令正在执行,那么客户端发送的 BGSAVE 命令则会被服务器拒绝。尽管 BGSAVE 和 BGREWRITEAOF 命令的实际工作都由子进程执行,而且它们在操作方面也没有什么冲突的地方,但之所以不能同时执行它们,主要是出于性能方面的考虑,因为它们都涉及同时执行大量的磁盘写入操作。
由于 RDB 文件的载入工作是在服务器启动时自动执行的,所以 Redis 没有专门用于载入 RDB 文件的命令,只要服务器启动时检测到 RDB 文件存在,它就会自动载入 RDB 文件。另外值得一提的是,因为 AOF 文件的更新频率通常高于 RDB 文件,因此如果服务器开启了 AOF 持久化功能,那么服务器会优先使用 AOF 文件来还原数据库状态。
因为 BGSAVE 命令的执行不阻塞服务器,所以 Redis 允许用户通过配置 save 选项设置多个保存条件来让服务器每隔一段时间就自动执行一次 BGSAVE 命令,只要其中任意一个条件被满足,服务器就会执行 BGSAVE 命令。比如,服务器的默认 save 选项配置如下:
save 900 1
save 300 10
save 60 10000
这表示只要满足以下三个条件之一,BGSAVE 命令就会被执行:
(1)服务器在 900 秒之内,对数据库进行了至少 1 次修改。
(2)服务器在 300 秒之内,对数据库进行了至少 10 次修改。
(3)服务器在 60 秒之内,对数据库进行了至少 10000 次修改。
Redis 服务器启动时,用户可以通过指定配置文件或者传入启动参数的方式设置 save 选项,服务器程序会根据 save 选项设置的保存条件来设置服务器状态 redisServer 结构的 saveparams 属性,该属性是一个数组,其中的每个元素都是一个 saveparam 结构,每个结构保存一个 save 选项设置的保存条件。
除了 saveparams 数组之外,服务器状态还维护着一个 dirty 计数器和一个 lastsave 属性。其中,dirty 计数器记录距离上一次成功执行 SAVE 或者 BGSAVE 命令后,服务器又对数据库状态(服务器中的所有数据库)进行了多少次修改(包括写入、删除和更新等操作)。而 lastsave 属性是一个 UNIX 时间戳,记录了服务器上一次成功执行 SAVE 或 BGSAVE 命令的时间。
Redis 的服务器周期性操作函数 serveCron 默认每隔 100 毫秒就会执行一次,它用于对正在运行的服务器进行维护,它的其中一项工作就是检查 save 选项所设置的保存条件是否已经满足,只要有一个满足,它就会执行 BGSAVE 命令。这个过程的伪代码如下。
以上就是 Redis 服务器根据 save 选项所设置的保存条件来自动执行 BGSAVE 命令,从而进行间隔性数据保存的实现原理。
参考书籍:《Redis 设计与实现》第 10 章——RDB 持久化。
RDB 持久化可以手动执行,也可根据服务器配置选项定期执行。
SAVE 和 BGSAVE 命令可以用于生成 RDB 文件。SAVE 命令会阻塞 Redis 服务器进程,直到 RDB 文件创建完毕,在阻塞期间,服务器会拒绝客户端的任何命令请求。而 BGSAVE 命令则会单独派生一个子进程来负责创建 RDB 文件,因此服务器进程可以继续处理命令请求。创建 RDB 文件的工作实际上是由底层的 rdbSave 函数来完成的,SAVE 和 BGSAVE 命令只是以不同的方式调用这个函数而已,这可以通过以下的伪代码表示。
def SAVE(): rdbSave() # 创建 RDB 文件 def BGSAVE(): pid = fork() # 创建子进程 if pid == 0: rdbSave() # 子进程负责创建 RDB 文件 signal_parent() # 完成后向父进程发送信号 elif pid > 0: # 父进程继续处理命令请求,并通过轮询等待子进程的信号 handle_request_and_wait_signal() else: handle_fork_error() # 处理出错情况
虽然 Redis 在 BGSAVE 命令执行期间仍然可以继续处理客户端的命令请求,但是 SAVE、BGSAVE 和 BGREWRITEAOF 三个命令的处理方式却和平时有所不同。在 BGSAVE 命令执行期间,客户端发送的 SAVE 和 BGSAVE 命令都会被服务器拒绝,这主要是为了避免多个进程同时执行 rdbSave 函数,从而产生竞争条件。而 BGREWRITEAOF 命令在 BGSAVE 命令执行期间会被延迟,直到 BGSAVE 命令执行完毕后才会执行。反过来,如果 BGREWRITEAOF 命令正在执行,那么客户端发送的 BGSAVE 命令则会被服务器拒绝。尽管 BGSAVE 和 BGREWRITEAOF 命令的实际工作都由子进程执行,而且它们在操作方面也没有什么冲突的地方,但之所以不能同时执行它们,主要是出于性能方面的考虑,因为它们都涉及同时执行大量的磁盘写入操作。
由于 RDB 文件的载入工作是在服务器启动时自动执行的,所以 Redis 没有专门用于载入 RDB 文件的命令,只要服务器启动时检测到 RDB 文件存在,它就会自动载入 RDB 文件。另外值得一提的是,因为 AOF 文件的更新频率通常高于 RDB 文件,因此如果服务器开启了 AOF 持久化功能,那么服务器会优先使用 AOF 文件来还原数据库状态。
因为 BGSAVE 命令的执行不阻塞服务器,所以 Redis 允许用户通过配置 save 选项设置多个保存条件来让服务器每隔一段时间就自动执行一次 BGSAVE 命令,只要其中任意一个条件被满足,服务器就会执行 BGSAVE 命令。比如,服务器的默认 save 选项配置如下:
save 900 1
save 300 10
save 60 10000
这表示只要满足以下三个条件之一,BGSAVE 命令就会被执行:
(1)服务器在 900 秒之内,对数据库进行了至少 1 次修改。
(2)服务器在 300 秒之内,对数据库进行了至少 10 次修改。
(3)服务器在 60 秒之内,对数据库进行了至少 10000 次修改。
Redis 服务器启动时,用户可以通过指定配置文件或者传入启动参数的方式设置 save 选项,服务器程序会根据 save 选项设置的保存条件来设置服务器状态 redisServer 结构的 saveparams 属性,该属性是一个数组,其中的每个元素都是一个 saveparam 结构,每个结构保存一个 save 选项设置的保存条件。
struct redisServer{ /* ... */ struct saveparam *saveparams; long long dirty; // 修改计数器 time_t lastsave; // 上一次执行保存的时间 /* ... */ }; struct saveparam{ time_t seconds; // 秒数 int changes; // 修改数 };
除了 saveparams 数组之外,服务器状态还维护着一个 dirty 计数器和一个 lastsave 属性。其中,dirty 计数器记录距离上一次成功执行 SAVE 或者 BGSAVE 命令后,服务器又对数据库状态(服务器中的所有数据库)进行了多少次修改(包括写入、删除和更新等操作)。而 lastsave 属性是一个 UNIX 时间戳,记录了服务器上一次成功执行 SAVE 或 BGSAVE 命令的时间。
Redis 的服务器周期性操作函数 serveCron 默认每隔 100 毫秒就会执行一次,它用于对正在运行的服务器进行维护,它的其中一项工作就是检查 save 选项所设置的保存条件是否已经满足,只要有一个满足,它就会执行 BGSAVE 命令。这个过程的伪代码如下。
def serverCron(): # ... for saveparam in server.saveparams: interval = unixtime_now() - server.lastsave; if server.dirty >= saveparam.changes and interval > saveparam.seconds: BGSAVE() break # ...
以上就是 Redis 服务器根据 save 选项所设置的保存条件来自动执行 BGSAVE 命令,从而进行间隔性数据保存的实现原理。
参考书籍:《Redis 设计与实现》第 10 章——RDB 持久化。
发表评论
-
Lua 脚本
2019-10-07 19:49 685Redis 2.6 版本开始引入对 Lua 脚 ... -
Redis事务的实现
2019-09-22 18:56 471Redis 事务是 ... -
Redis集群之复制、故障转移及消息实现
2019-09-14 21:04 501在Redis集群 ... -
Redis集群实现原理
2019-09-14 12:19 678Redis 集群是 Redis 提供的分布式数 ... -
sentinel 系统介绍
2019-08-04 18:35 503Sentinel(哨兵)是 Redis 的高可 ... -
数据库复制
2019-07-13 22:02 367在连接到一 ... -
redis 客户端实现
2019-06-02 15:06 374Redis 服务器是典型的一对多服务器程序,通 ... -
AOF 持久化
2019-05-12 13:36 417除了前面提到的 RDB 持久化功能外,Redi ... -
RDB 文件结构
2019-04-27 12:10 579在RDB 持久化一节中,我们对 RDB 持久化 ... -
Redis 数据库通知功能的实现
2019-04-07 11:56 1287Reids 数据库通知功能可以让客户端通过订阅 ... -
数据库实现
2019-03-24 13:58 445Redis 服务器将其所有的数据库都保存在 r ... -
Redis 五种对象
2019-01-20 11:13 364阅读本节前需要阅读 Redis 对象系统概览一 ... -
Redis 对象系统概览
2019-01-06 13:10 783前面介绍了 Redis 中用到的所有主要数据结 ... -
整数集合与压缩列表
2018-12-09 21:19 592在 Redis 中,当一 ... -
跳跃表在 Redis 中的应用
2018-08-23 16:30 2027前提申明,因篇幅 ... -
字典实现
2018-08-20 15:49 568字典在 Redis 中的应用相当广泛,如 Redis ... -
redis 字符串和列表实现
2018-08-08 16:41 750Redis 虽说由 C 语言 ...
相关推荐
- RDB持久化机制: - RDB默认开启 - RDB存储二进制数据,RDB在持久化和读取持久化文件时,速度较快 - RDB持久化的时机: save second keys # 在second时间内,执行了key次写操作,就执行RDB的持久化 - 优缺点...
RDB持久化是通过创建数据集的快照来实现的。Redis通过fork操作创建一个子进程,子进程将数据写入临时文件,完成快照后用临时文件替换旧的持久化文件。这种方式是Redis的一种快照持久化方式,它能够将某一时刻的内存...
Redis RDB持久化.flv
Redis 持久化是确保数据安全的重要机制,它提供了两种主要的方法:RDB(Redis Database)和 AOF(Append Only File)。RDB 是一种快照式的持久化方式,而 AOF 则记录每次写操作的日志。 RDB 持久化在特定条件下将...
RDB持久化RDB(Redis DataBase)持久化是一种基于快照的持久化方式。在指定的时间间隔内,如果满足一定条件(如某段时间内发生的写操作次数),Redis会生成一个包含当前内存数据的RDB文件。这个RDB文件可以用于数据...
RDB持久化方案是指在指定的时间间隔内,通过对当前数据集生成数据快照(即一个二进制文件)来保存数据状态。RDB是一种数据备份的模式,可以通过配置来设置快照的生成频率,比如每5分钟生成一次快照。RDB的优点包括...
为了保证数据的安全性和持久性,Redis 提供了两种主要的持久化机制:RDB 快照(Redis Database Backup)和 AOF(Append Only File)。本文将详细介绍这两种持久化方式的原理、配置方法及其各自的优缺点。 #### RDB ...
2. **性能影响**: 在大数据集的情况下,执行RDB持久化操作需要调用fork()函数来创建子进程,这可能会导致Redis暂时无法响应客户端请求,特别是在CPU性能不足的情况下。 #### AOF 持久化方案 **概述** AOF方式记录...
RDB持久化的过程关注的是数据快照,即在某个时间点将内存中的所有数据保存到磁盘上。RDB方式通过执行save命令或bgsave命令来创建快照。其中,save命令会阻塞Redis服务器,直到RDB过程完成,因此在生产环境中一般不...
- **数据安全性**:AOF持久化通常比RDB持久化更安全,因为它能够记录每一次写操作,即使在断电情况下也能够通过回放AOF文件来恢复数据。 - **恢复速度**:RDB持久化恢复数据的速度通常比AOF更快,因为只需要加载一次...
Redis 是一个高性能的 NoSQL 数据库,为了确保数据的安全性和可靠性,Redis 提供了多种持久化机制,分别是 RDB 持久化方式和 AOF 持久化方式。本文将对 Redis 持久化机制进行详细的介绍和比较。 RDB 持久化方式 ...
* 自动触发RDB持久化:Redis内部还存在自动触发RDB持久化机制,例如使用save相关配置、从节点执行全量复制操作等。 本文档为开发者提供了Redis性能调优的相关知识点,涵盖数据库管理、慢查询日志、RDB持久化等方面...
**RDB持久化**: RDB是Redis的一种快照持久化方式。它会在某个时间点创建一个数据库的完整备份,即生成一个二进制文件,通常命名为`dump.rdb`。这个过程由Redis服务器后台异步执行,不会影响到正常服务。当Redis重启...
本文主要介绍了 Redis 的两种持久化机制:RDB(Redis Database Backup file)和 AOF(Append Only File),重点讲解了 RDB 的工作原理与实现。 RDB 是 Redis 数据库的一种快照备份,它将当前内存中的数据库状态保存...
在RDB持久化过程中,Redis会将当前数据库状态以二进制的形式保存到一个文件中,通常命名为`dump.rdb`。这种持久化方式的主要特点和优缺点如下: **优点**: 1. **高性能**:RDB是通过fork子进程来执行的,主进程不...
### RDB持久化 RDB是通过创建数据的快照来实现持久化。Redis提供了`SAVE`和`BGSAVE`两个命令来触发快照生成: 1. **SAVE命令**:这个命令会阻塞Redis服务器,直到快照创建完成。这意味着在保存过程中,Redis无法...
1. RDB 持久化:这是一种定期快照的方式,通过 `save` 配置项来定义触发保存的条件。例如: ``` save 900 1 save 300 10 save 60 10000 ``` 这表示在 900 秒(15 分钟)内只要有 1 个键发生变化,或者 300 秒...
Redis 提供了两种主要的持久化方法:RDB(Redis Database Persistence,快照持久化)和 AOF(Append Only File,日志持久化)。 RDB 持久化通过定期生成数据集的快照来保存数据,这个过程由 Redis 的子进程执行,...
RDB持久化会定期生成数据库的一个快照(二进制文件),保存当前时刻Redis内存中的所有数据。这种快照可以在系统崩溃后用于恢复数据。RDB文件是经过压缩的,能快速加载,但可能会丢失最后一次持久化以来的数据。 **...