我们知道 Redis 是内存数据库,它将自己的数据存储在内存中,如果它不想办法将数据存入磁盘中,那么当服务器进程退出或意外宕掉的时候,服务器中的数据也会消失。

为了解决这个问题, Redis 提供了 RDB 与 AOF 两种数据持久化方式,将数据存储到磁盘中,避免数据丢失。

AOF 持久化不在本篇文章讨论范围内,如果大家感兴趣可以关注后面的总结文章。

一、RDB 介绍

RDB(Redis DataBase)持久化既可以手动执行,也可以通过触发服务器配置信息自动执行,用来将某个时间点上的数据保存到磁盘上的一个 RDB(dump.rdb) 文件中。

因为 dump.rdb 文件是保存在磁盘上的,即使 Redis 服务器进程退出或者意外宕掉,也可以通过该文件进行数据还原。

有两个命令可以用于生成 RDB 文件,一个是 SAVE 一个是 BGSAVE,但是这两个命令不可以同时被服务器处理。这两个命令的不同点主要是:

  • SAVE 命令会阻塞服务器进程,直到 RDB 文件创建完毕为止,在服务器进行阻塞期间,服务器不能处理任何命令请求。
  • BGSAVE 命令会派生出一个子进程,然后由子进程负责创建 RDB 文件,在这种情况下,服务器进程可以继续处理后续的命令请求。

想要生成 RDB 文件需要一定的条件,但是载入 RDB 文件只需要启动服务器即可,只要 Redis 服务器在启动时监测到 RDB 文件的存在,就会自动载入 RDB 文件。当服务器载入 RDB 文件期间,会一直处于阻塞状态,直到载入工作完成为止

PS:
因为 AOF 文件的更新频率高于 RDB 文件,所以当两种持久化模式都开启时,服务器会优先使用 AOF 文件来还原数据库。

二、自动间隔性同步数据

因为 BGSAVE 命令可以在不阻塞服务器进程的情况下执行,所以 Redis 允许用户通过自定义服务器配置信息,让服务器每隔一段时间就自动执行一次 BGSAVE 命令。

用户可以使用 save time count 设置多个条件,只要其中一个条件被满足,服务器就会自动执行 BGSAVE 命令,具体的触发条件可以在 redis.conf 中进行配置。

默认的配置信息如下:

save 900 1    # 在 900s 之内至少对数据库进行了 1 次修改
save 300 10   # 在 3000s 之内对数据库至少进行了 1 次修改
save 60 10000 # 在 60s 之内至少对数据库进行了 10000 次修改

Redis 底层会使用 saveParam 结构保存时间与修改次数:

struct saveparam {// 秒数time_t seconds;// 修改次数int changes;
};

最终会使用一个 saveparam 数组来保存相关的配置信息,下面是一个具体的图

redisServer 对象除了维护着一个 saveparam 数组外,还维护着一个 dirty 计数器与 lastsave 属性。

  • 每当服务器修改命令之后,程序就会自动对 dirty 属性执行更新,执行了多少次修改,dirty 就对应增加多少。
  • lastsave 属性记录了服务器上次执行保存(SAVEBGSAVE)操作的时间。

在服务器执行周期函数时(serverCron(),默认 100ms 执行一次),会根据 saveparamdirtylastsave 属性,自动判断出执行保存的时机。

三、RDB 持久化过程演示

下面简单的还原一下 RDB 文件数据恢复的过程,推荐大家自己尝试一下。

1.修改 redis.conf 配置文件中的 save 属性,设置在 10s 内修改了数据库就执行 BGSAVE 命令(保证在短时间内获得 RDB 文件)。

save 10 1    # 在 10s 之内至少对数据库进行了 1 次修改
save 300 10
save 60 10000

2.为了保证测试的正确性,可以在 Redis 客户端执行一次 FLUSHDB 命令,清空当前数据库中的所有数据,退出客户端并删除 dump.rdb 文件(其实执行 FLUSHDB 命令后 dump.rdb 中已经没有有效数据了)。

3.连接 Redis 客户端,添加一条数据,大约 10s 钟左右退出 Redis 客户端。

127.0.0.1:6379> KEYS *
(empty list or set)
127.0.0.1:6379> SET key1 value1
OK

4.查看当前文件下的所有文件,发现多了一个 dump.rdb 文件,然后使用 mv 命令修改 dump.rdb 文件名为 dump1.rdb。再次连接 Redis 客户端,执行一次 FLUSHDB 命令,确保当前数据库中没有任何数据。

5.由于 FLUSHDB 命令也会产生 dump.rdb 文件,因此要删除该 dump.rdb 文件,修改 dump1.rdb 文件名为dump.rdb,用来还原数据,接着关闭 Redis 服务。

6.重启 Redis 服务,因为 Redis 服务在启动时会加载 dump.rdb 文件,因此在使用客户端连接到数据库时,dump.rdb 文件中的数据会被还原。

127.0.0.1:6379> keys *
1) "key1"

四、参考资料

《Redis 设计与实现》 黄建宏 著

Redis 数据持久化之 RDB相关推荐

  1. Redis数据持久化机制AOF原理分析一---转

    http://blog.csdn.net/acceptedxukai/article/details/18136903 http://blog.csdn.net/acceptedxukai/artic ...

  2. Redis哨兵主备切换的数据丢失及Redis数据持久化

    一 两种数据丢失的情况 异步复制导致数据丢失 master->slave复制数据是异步的,可能有部分数据还没复制到slave,master就宕机了,此时导致数据丢失 集群脑裂导致数据丢失 mas ...

  3. Redis 数据持久化的方案的实现

    一.需要了解的基础 1.Redis实现数据持久化的两种实现方式: RDB:指定的时间间隔内保存数据快照 AOF:先把命令追加到操作日志的尾部,保存所有的历史操作 二.RDB 实现 Redis数据持久化 ...

  4. redis的持久化方式RDB和AOF的区别

    https://blog.csdn.net/m0_38110132/article/details/76906422 博客 学院 下载 图文课 论坛 APP 问答 商城 VIP会员 活动 招聘 ITe ...

  5. Redis数据持久化机制AOF原理分析二

    本文所引用的源码全部来自Redis2.8.2版本. Redis AOF数据持久化机制的实现相关代码是redis.c, redis.h, aof.c, bio.c, rio.c, config.c 在阅 ...

  6. Redis数据持久化(详解+样例)

    一.实验目的 1.了解 Redis 数据库的持久化机制 2.直接使用 Redis 进行持久化操作 3.Docker 下 Redis 的持久化操作 二.Redis持久化 2.1 什么是持久化 关系型数据 ...

  7. 【Redis学习笔记】09.Redis 数据持久化

    Redis 数据持久化 1. 持久化概述 2. RDB 持久化 2.1. RDB 持久化优点 2.2. RDB 持久化缺点 2.3. RDB 持久化原理 2.4. RDB 触发方式 2.5. save ...

  8. redis数据持久化详解

    一.概念 一)redis提供了不同级别的持久化方式: RDB持久化方式能够在指定的时间间隔能对你的数据进行快照存储. AOF持久化方式记录每次对服务器写的操作,当服务器重启的时候会重新执行这些命令来恢 ...

  9. 重启redis命令_redis系列之——数据持久化(RDB和AOF)

    在数据库(如mysql)和缓存(如redis)的发展中,都会相互借鉴对方的长处来弥补自身的不足.比如mysql作为持久化数据库,为了提高数据的访问速度,会使用缓存技术,当一条sql查询完成后,mysq ...

最新文章

  1. 使用容器的正确方式,Docker在雪球的技术实践
  2. 4-希尔排序C实现(递增递减的简单转换)
  3. vue路由切换和用location切换url的区别
  4. 打印图形(2)(直角三角形)(C+Java)
  5. AWS Lambda事件源映射:使您的触发器混乱无序
  6. 将ActiveMQ持久消息传递性能提高25倍
  7. python函数的作用降低编程复杂度_Python函数式编程
  8. Vue中 $ref 的用法
  9. centos6 postgresql安装
  10. 单片机实验:外部中断按键
  11. chrome 调试 ios h5
  12. 《DSP using MATLAB》示例Example4.6
  13. 一个解析XML的VB类
  14. Zalo电脑版多开软件
  15. 【计算机前沿知识】大数据与数据挖掘
  16. layui tree组件更改图标
  17. 软件工程领域国际会议列表
  18. 奇点云数据中台技术汇(七) | 数据智能模型——数据中台航母的作战集群
  19. 从生活角度学习c++
  20. SharpDevelop5.1支持.net4.5.2以上版本

热门文章

  1. 【Redis系列】深入浅出Redis主从复制之哨兵模式【实践】
  2. 【大白话系列】图解TCP三次握手【使用wireshark工具抓包分析TCP三次交互流程】
  3. Yuhao and a Parenthesis
  4. huizhang要约会
  5. mysql的存储覆盖_mysql覆盖存储
  6. mybatis-plus与jpa在操作数据库时写法对比
  7. mybatis的mapper.xml文件中含有中文注释时运行出错,mybatis配置优化和别名优化 mybatis配置之映射器说明
  8. TensorFlow学习笔记之五(卷积神经网络)
  9. Spring-学习笔记03【Spring的IOC和DI】
  10. sgi stl 之list