`RDB`全称为:`Redis DataBase`,是`Redis`当中默认的持久化方案。当触发持久化条件时,`Redis`默认会生成一个`dump.rdb`文件,`Redis`在重启的时候就会通过解析`dump.rdb`文件进行数据恢复。
#### RDB 机制触发条件
`RDB`持久化机制有两种触发方式:自动触发和手动触发。
#### 自动触发
自动触发方式也可以分为三种:
* 执行`flushall`命令(`flushdb`命令不会触发)时,不过此时生成的`dump`文件内的数据是空的(`dump`文件还会存储一些头信息,所以文件本身是有内容的,只是没有数据),没有什么太大的实际意义。
* 执行`shutdown`命令时会触发生成`dump`文件。
* 通过配置文件自动生成,`Redis`中配置文件默认配置如下。
~~~
save 900 1 #900秒内至少有1个key被添加或者更新
save 300 10 #300秒内至少有10个key被添加或者更新
save 60 10000 #60秒内至少有10000个key被添加或者更新
~~~
只要达到这三个条件中的任意一个,就会触发`Redis`的`RDB`持久化机制。
#### 手动触发
除了自动触发,`Redis`中还提供了`2`个手动触发`RDB`机制的命令(这两个命令不能同时被执行,一旦一个命令正在执行中,另一个命令会被拒绝执行):
* `save`:这个命令会阻塞`Redis`服务器进程,直到成功创建`RDB`文件,也就是说在生成`RDB`文件之前,服务器不能处理客户端发送的任何命令。
* `bgsave`:父进程会执行`fork`操作来创建一个子进程。`RDB`文件由子进程来负责生成,父进程可以正常处理客户端发送的命令(这也是`Redis`不仅仅只是单线程的一个体现)。
如果想要知道上一次成功执行`save`或者`bgsave`命令的时间,可以执行`lastsave`命令进行查看,`lastsave`命令返回的是一个`unix`时间戳。
#### RDB 机制相关配置文件
除了上面提到的触发生成`rdb`文件的配置参数,`RDB`持久化机制还有如下一些相关命令:
* `dir`:`rdb`文件生成目录。默认是`./`(当前安装目录),可以执行命令`config get dir`进行查看,如下图所示说明当前`dump`文件生成目录为`/home/project`:
![](https://img.kancloud.cn/68/eb/68eb39acfd4281526d22b1737717011a_402x84.png)
* `dbfilename`:`rdb`文件名。默认是`dump.rdb`。
* `rdbcompression`:`rdb`文件是否是`LZF`压缩文件。默认是`yes`。
* `rdbchecksum`:是否开启数据校验。默认是`yes`。
#### RDB 机制优点
* `RDB`是一个非常紧凑的压缩文件,保存了不同时间点上的文件,非常适合用来灾备和数据恢复。
* `RDB`最大限度地提高了`Redis`的性能,因为`Redis`父进程需要做的唯一的工作就是派生一个子进程来完成剩下的工作,父进程永远不会执行磁盘`I/O`或类似的耗时操作。
* 与后面介绍的`AOF`持久化机制比较,`RDB`方式恢复数据的速度更快。
#### RDB 机制缺点
* `RDB`无法做到实时备份,所以如果`Redis`因异常停止工作而没有正确的关机,那么从上一次备份到异常宕机的这一段时间的数据将会丢失。
* `RDB`通常需要父进程来执行`fork`操作创建子线程,所以如果频繁执行`fork`操作而`CPU`性能又不是很高的话可能会造成短时间内父进程不可用。
- Redis 为什么这么快
- 什么是 Redis
- Redis 的安装
- Redis 到底有多快
- Redis 是单线程还是多线程
- Redis 为什么选择使用单线程来执行请求
- 什么是 IO 多路复用机制
- Redis 中 I/O 多路复用的应用
- 一个简单的字符串,为什么 Redis 要设计的如此特别
- Redis 的 9 种数据类型
- 二进制安全字符串
- sds 空间分配策略
- sds 和 C 语言字符串区别
- sds 是如何被存储的
- type 属性
- encoding 属性
- 通过牺牲速度来节省内存,Redis 是觉得自己太快了吗
- 什么是压缩列表
- ziplist 的存储结构
- entry 存储结构
- ziplist 数据示例
- ziplist 连锁更新问题
- 为了加快速度,Redis 都做了哪些“变态”设计
- 列表对象
- linkedlist
- linkedlist 和 ziplist 的选择
- quicklist
- 列表对象常用操作命令
- Redis 中哈希分布不均匀该怎么办
- 哈希对象
- hashtable
- ziplist
- ziplist 和 hashtable 的编码转换
- 哈希对象常用命令
- 同一份数据,Redis 为什么要存”两次”
- 五种基本类型之集合对象
- intset 编码
- 集合对象常用命令
- 五种基本类型之有序集合对象
- skiplist 编码
- ziplist 编码
- ziplist 和 skiplist 编码转换
- 有序集合对象常用命令
- 要想用活 Redis,Lua 脚本是绕不过去的坎
- 发布与订阅
- 基于频道的实现
- 基于模式的实现
- Lua 脚本
- Lua 脚本的调用
- Lua 脚本中执行 Redis 命令
- Lua 脚本摘要
- Lua 脚本文件
- 脚本异常
- 作为一款内存数据库,为什么断电后 Redis 数据不会丢失
- Redis 持久化机制
- RDB 持久化机制
- AOF 持久化机制
- 内存耗尽后 Redis 会发生什么
- 内存回收
- 过期策略
- 8 种淘汰策略
- LRU 算法
- LFU 算法
- 不能回滚的 Redis 事务还能用吗
- Redis 有事务吗
- Redis 事务实现原理
- Redis 事务 ACID 特性
- watch 命令
- watch 命令的作用
- watch 原理分析
- Redis 为什么不直接用 master-slave 集群
- Redis 集群方案
- 主从复制
- 配置一主两从 master-slave 集群
- 主从复制原理分析
- 主从服务的不足之处
- Sentinel(哨兵)机制为什么从神坛滑落
- 哨兵 Sentinel 机制
- Sentinel 原理分析
- 配置 Sentinel 集群
- Sentinel 机制实战
- Sentinel 机制的不足之处
- Redis Cluster 集群凭什么成为了最终的胜利者
- Redis 分布式集群方案
- 客户端实现分片
- 中间代理服务实现分片
- Redis Cluster 方案
- 手动配置一个 Redis Cluster 集群
- Redis Cluster 集群常用命令
- 客户端如何使用 Redis Cluster 集群
- Redis Cluster 的不足
- 如何从 10 亿数据中快速判断是否存在某一个元素
- 缓存雪崩
- 缓存击穿
- 缓存穿透
- 布隆过滤器(Bloom Filter)
- 布隆过滤器的 2 大特点
- 布隆过滤器的实现(Guava)
- 布隆过滤器的如何删除