RDB(Redis DataBase)

redis是一个内存数据库,数据保存在内存中,但是我们都知道内存的数据变化是很快的,也容易发生丢失。幸好Redis还为我们提供了持久化的机制,分别是RDB(Redis DataBase)和AOF(Append Only File)。

一、持久化流程

既然redis的数据可以保存在磁盘上,那么这个流程是什么样的呢?

要有下面五个过程:

(1)客户端向服务端发送写操作(数据在客户端的内存中)。

(2)数据库服务端接收到写请求的数据(数据在服务端的内存中)。

(3)服务端调用write这个系统进程,将数据往磁盘上写(数据在系统内存的缓冲区中)。

(4)操作系统将缓冲区中的数据转移到磁盘控制器上(数据在磁盘缓存中)。

(5)磁盘控制器将数据写到磁盘的物理介质中(数据真正落到磁盘上)。

这5个过程是在理想条件下一个正常的保存流程,但是在大多数情况下,我们的机器等等都会有各种各样的故障,这里划分了两种情况:

(1)Redis数据库发生故障,只要在上面的第三步执行完毕,那么就可以持久化保存,剩下的两步由操作系统替我们完成。

(2)操作系统发生故障,必须上面5步都完成才可以。

在这里只考虑了保存的过程可能发生的故障,其实保存的数据也有可能发生损坏,需要一定的恢复机制,不过在这里就不再延伸了。现在主要考虑的是redis如何来实现上面5个保存磁盘的步骤。它提供了两种策略机制,也就是RDB和AOF。

二、RDB机制

RDB其实就是把数据以快照的形式保存在磁盘上。什么是快照呢,你可以理解成把当前时刻的数据拍成一张照片保存下来。

RDB持久化是指在指定的时间间隔内将内存中的数据集快照写入磁盘。也是默认的持久化方式,这种方式是就是将内存中数据以快照的方式写入到二进制文件中,默认的文件名为dump.rdb。

在我们安装了redis之后,所有的配置都是在redis.conf文件中,里面保存了RDB和AOF两种持久化机制的各种配置。(redis.conf配置详解)

既然RDB机制是通过把某个时刻的所有数据生成一个快照来保存,那么就应该有一种触发机制,是实现这个过程。对于RDB来说,提供了三种机制:save、bgsave、自动化。我们分别来看一下

1、save触发方式

该命令会阻塞当前Redis服务器,执行save命令期间,Redis不能处理其他命令,直到RDB过程完成为止。具体流程如下:

执行完成时候如果存在老的RDB文件,就把新的替代掉旧的。我们的客户端可能都是几万或者是几十万,这种方式显然不可取。

2、bgsave触发方式

执行该命令时,Redis会在后台异步进行快照操作,快照同时还可以响应客户端请求。具体流程如下:

具体操作是Redis进程执行fork操作创建子进程,RDB持久化过程由子进程负责,完成后自动结束。阻塞只发生在fork阶段,一般时间很短。基本上 Redis 内部所有的RDB操作都是采用 bgsave 命令。

3、自动触发

自动触发是由我们的配置文件来完成的。在redis.conf配置文件中,里面有如下配置,我们可以去设置:

①save:这里是用来配置触发 Redis的 RDB 持久化条件,也就是什么时候将内存中的数据保存到硬盘。比如“save m n”。表示m秒内数据集存在n次修改时,自动触发bgsave。

默认如下配置:

#表示900 秒内如果至少有 1 个 key 的值变化,则保存save 900 1

#表示300 秒内如果至少有 10 个 key 的值变化,则保存save 300 10

#表示60 秒内如果至少有 10000 个 key 的值变化,则保存save 60 10000

不需要持久化,那么你可以注释掉所有的 save 行来停用保存功能。

②stop-writes-on-bgsave-error :默认值为yes。当启用了RDB且最后一次后台保存数据失败,Redis是否停止接收数据。这会让用户意识到数据没有正确持久化到磁盘上,否则没有人会注意到灾难(disaster)发生了。如果Redis重启了,那么又可以重新开始接收数据了

③rdbcompression :默认值是yes。对于存储到磁盘中的快照,可以设置是否进行压缩存储。

④rdbchecksum :默认值是yes。在存储快照后,我们还可以让redis使用CRC64算法来进行数据校验,但是这样做会增加大约10%的性能消耗,如果希望获取到最大的性能提升,可以关闭此功能。

⑤dbfilename :设置快照的文件名,默认是 dump.rdb

⑥dir:设置快照文件的存放路径,这个配置项一定是个目录,而不能是文件名。

我们可以修改这些配置来实现我们想要的效果。因为第三种方式是配置的,所以我们对前两种进行一个对比:

4、RDB 的优势和劣势

①、优势

(1)RDB文件紧凑,全量备份,非常适合用于进行备份和灾难恢复。

(2)生成RDB文件的时候,redis主进程会fork()一个子进程来处理所有保存工作,主进程不需要进行任何磁盘IO操作。

(3)RDB 在恢复大数据集时的速度比 AOF 的恢复速度要快。

②、劣势

RDB快照是一次全量备份,存储的是内存数据的二进制序列化形式,存储上非常紧凑。当进行快照持久化时,会开启一个子进程专门负责快照持久化,子进程会拥有父进程的内存数据,父进程修改内存子进程不会反应出来,所以在快照持久化期间修改的数据不会被保存,可能丢失数据。

三、RDB备份与恢复

1.查看库里的数据

2.获取redis目录

3.模拟将redis的rdb文件删除,同时关闭数据库

4.启动数据库,发现库为空

5.关闭redis,模拟还原rdb文件,启动redis(注意顺序,小心数据被覆盖)

优点:
1、适合大规模的数据恢复!
2、对数据的完整性要不高!
缺点:
1、需要一定的时间间隔进程操作!如果redis意外宕机了,这个最后一次修改数据就没有的了!
2、fork进程的时候,会占用一定的内容空间!!

四、RDB和AOF到底该如何选择

选择的话,两者加一起才更好。因为两个持久化机制你明白了,剩下的就是看自己的需求了,需求不同选择的也不一定,但是通常都是结合使用。有一张图可供总结:

五、扩展
1、RDB 持久化方式能够在指定的时间间隔内对你的数据进行快照存储

2、AOF 持久化方式记录每次对服务器写的操作,当服务器重启的时候会重新执行这些命令来恢复原始的数据。AOF命令以Redis 协议追加保存每次写的操作到文件末尾,Redis还能对AOF文件进行后台重写,使得AOF文件的体积不至于过大。

3、只做缓存,如果你只希望你的数据在服务器运行的时候存在,你也可以不使用任何持久化

4、同时开启两种持久化方式
在这种情况下,当redis重启的时候会优先载入AOF文件来恢复原始的数据,因为在通常情况下AOF文件保存的数据集要比RDB文件保存的数据集要完整。RDB 的数据不实时,同时使用两者时服务器重启也只会找AOF文件,那要不要只使用AOF呢?作者建议不要,因为RDB更适合用于备份数据库(AOF在不断变化不好备份),快速重启,而且不会有AOF可能潜在的Bug,留着作为一个万一的手段。

5、性能建议
因为RDB文件只用作后备用途,建议只在Slave上持久化RDB文件,而且只要15分钟备份一次就够了,只保留 save 900 1 这条规则。
如果启用 AOF ,好处是在最恶劣情况下也只会丢失不超过两秒数据,启动脚本较简单只load自己的AOF文件就可以了,代价一是带来了持续的IO,二是AOF rewrite 的最后将 rewrite 过程中产生的新数据写到新文件造成的阻塞几乎是不可避免的。只要硬盘许可,应该尽量减少AOF rewrite的频率,AOF重写的基础大小默认值64M太小了,可以设到5G以上,默认超过原大小100%大小重写可以改到适当的数值。
如果不启用 AOF ,仅靠 Master-Slave Repllcation 实现高可用性也可以,能省掉一大笔IO,也减少了rewrite时带来的系统波动。代价是如果Master/Slave 同时倒掉,会丢失十几分钟的数据,启动脚本也要比较两个 Master/Slave 中的 RDB文件,载入较新的那个,微博就是这种架构。

二十一、redis持久化之RDB相关推荐

  1. 十二、Redis持久化之AOF原理

    一.什么是AOF 它也是Redis持久化的重要手段之一,aof->Append Only File,只追加文件,也就是每次处理完请求命令后都会将此命令追加到aof文件的末尾.而RDB是压缩成二进 ...

  2. Redis理论知识——redis持久化(RDB、AOF)

    redis 一.高可用 1.1 概述 1.2 作用 二.Redis持久化 2.1 持久化的功能 2.2 Redis提供两种方式进行持久化 RDB 持久化 触发条件 执行流程 启动时加载 AOF持久化 ...

  3. Redis持久化原理(RDB)

    在上一篇文章中,介绍了Redis的内存模型很重要,从这篇文章开始,将依次介绍Redis高可用相关的知识--持久化.复制(及读写分离).哨兵.以及集群. 本文将先说明上述几种技术分别解决了Redis高可 ...

  4. Redis持久化之RDB原理

    Redis持久化之RDB 一.RDB文件作用 二. 触发条件 三.执行流程 1.总体流程 2.fork实现复制原理 四.RDB文件 五. 启动时加载 六. RDB常用配置总结 七.优缺点 1.优点 2 ...

  5. 【redis 四】一文搞懂redis持久化之RDB

    前言: redis持久化分为RDB和AOF,此篇博文着重讲解RDB方式的持久化.演示系统 centos7. 1.官网说明 地址:https://redis.io/topics/persistence ...

  6. Redis持久化(RDB 和 AOF)

    一.RDB持久化 RDB(Redis DataBase): 配置文件中对其的相关配置: 触发机制: 恢复rdb文件: 优点: 缺点: 二.AOF持久化 AOF(Append Only File): 配 ...

  7. redis 备份导出rdb_Redis学习——Redis持久化之RDB备份方式保存数据

    从这一个介绍里面知道,redis比memcache作为缓存数据库强大的地方,一个是支持的数据类型比较多,另一个就是redis持久化功能. 下面就介绍Redis的持久化之RDB! 一:什么是redis的 ...

  8. Redis持久化:RDB和AOF

    一.为什么需要持久化? Redis对数据的操作都是基于内存的,当遇到了进程退出.服务器宕机等意外情况,如果没有持久化机制,那么Redis中的数据将会丢失无法恢复.有了持久化机制,Redis在下次重启时 ...

  9. Redis持久化机制 RDB、AOF

    目录 一.RDB(Redis DataBase) 1.配置快照资格,在redis.conf文件中 2.如何触发RDB快照 3.执行flushall命令 4.快照的实现原理 5.优势与劣势 6.如何恢复 ...

  10. Redis持久化策略——RDB、AOF、混合

    一.RDB(redis database) Redis默认启用该模式进行持久化,自动RDB使用的是异步方式(开启子进程)生成全量快照,配置文件为 redis.conf ①配置项:dbfilename ...

最新文章

  1. paramiko监控 windows服务器 被监控服务器只需要安装openssh服务即可基于wmic完成大部分监控...
  2. JQuery dataTable 扩展+Ajax Post,Get一些基本操作(一)
  3. Flex布局(一)flex-direction
  4. 启明云推SigmaStar SSD201 双网口开发板的双网口配置说明
  5. python运行结果闪退_Pyhton TestCase运行闪退与失败,原因不详。。。
  6. Mysql代码生成器转Oracle代码生成
  7. 利用http-server测试vue-cli打包后的项目
  8. POJ1062 昂贵的聘礼(最短路径)
  9. 怎样组建云计算机,如何搭建云计算平台_搭建云计算平台步骤
  10. happy 2016, happy 11111100000
  11. 二叉树求到某一个节点路径
  12. 40页PPT勾画“互联网颠覆性思维”----诠释互联网思维
  13. 结构体转map[string]interface{}的若干方法
  14. php测线路网速,php 测试网速
  15. sgx芯片服务器,英特尔SGX概述:SGX内部实现分析研究(part1)
  16. Screw一键生成数据库文档
  17. Windows开启 CPU 虚拟化 + 关闭 Hyper-V
  18. 基金申请-2:期刊如何批量索引SCIE、EI、ISTP (CPCI)?
  19. 【blender建模功能】06 多边形建形工具
  20. stm32f103停止模式低功耗设置(最低5.7ua)

热门文章

  1. html双人台球游戏,使用h5和matter.js实现的简化版台球小游戏
  2. junit5_使用Junit测试名称
  3. 按一行一行的方法将一个文本文件复制到另一个文件中_大文件上的结构化数据计算示例...
  4. golang 接口_「实战」助力数据库开发之接口篇 - Golang 连接 Greenplum
  5. java注释跳转方法,Java自定义注解实现Router跳转
  6. list.php tid= field,织梦CMS初试-套用指定的html模板,解析内容列表【笔记】
  7. 皮一皮:碰到这样的领导怎么办...
  8. ThreadPoolExecutor 的八种拒绝策略 | 含番外!
  9. 「文末预告,注意查收」告别枯燥的理论,回归技术
  10. ps随机排列_漂亮!自然材料:人工可控微米级胶体粒子“堆积木”——粒子随心所欲的组装排列!...