因为Redis服务器将数据存储在内存里面,而一旦服务器被关闭或者运行服务器的主机本身被关闭的话,存储在内存里面的数据就会消失不见;

如果我们仅仅是将redis用作缓存的话,那么这种数据丢失带来的问题并不是非常大,我们只需要重启机器,然后再次将数据放到缓存里面就可以了;

但如果我们将redis用作数据库的话,那么这种数据丢失就不能接受了。

一、RDB持久化原理

将服务器包含的所有数据库数据以二进制文件的形式保存到硬盘里面。

通过在服务器启动时载入RDB文件,服务器可以根据RDB文件的内容,还原服务器原有的数据库数据。

二、创建RDB文件
Redis服务器在什么时候创建RDB文件?
1) 服务器执行客户端发送的SAVE命令;(手动执行)
2) 服务器执行客户端发送的BGSAVE命令;(手动执行)
3) 使用save配置选项设置的自动保存条件被满足,服务器自动执行BGSAVE命令;(自动执行)

2.1 手动创建RDB文件之SAVE命令

通过使用客户端向服务器发送SAVE命令,可以命令服务器去创建一个新的RDB文件;

redis> SAVE
OK

在执行SAVE命令时过程中(也就是创建RDB文件的过程中),redis服务器将被阻塞,无法处理客户端发送的命令请求,只有在SAVE命令执行完毕后(也就是RDB文件创建完毕之后),服务器才会重新开始处理客户端发送的命令请求;如果RDB文件已经存在,那么服务器将使用新的RDB文件去替代旧的RDB文件。

SAVE命令的复杂度为O(N),N为服务器中所有数据库包含的键值对数量总和。

2.2手动创建RDB文件之BGSAVE命令

BGSAVE命令同样可以创建一个新的RDB文件,这个命令和SAVE命令的区别在于:BGSAVE不会造成redis服务器阻塞,在执行BGSAVE命令的过程中,redis服务器 仍然可以正常地处理其他客户端发送的命令请求。

BGSAVE是一个异步命令,发送命令的客户端立即得到回复,而实际的操作是在回复之后才开始;

redis> BGSAVE
Background saving started

BGSAVE命令的复杂度和SAVE一样,都是O(N),N为服务器中所有数据库包含的键值对数量总和。

BGSAVE不会造成阻塞的原因:
1) 当redis服务器 接收到BGSAVE命令时,它不会自己来创建RDB文件,而是通过fork()来生成一个子进程,然后由子进程负责创建RDB文件,而自己则继续处理客户端的命令请求;
2) 当子进程创建好RDB文件并退出时,它会向父进程(也就是负责处理命令请求的redis服务器)发送一个信号,告知它RDB文件已经创建完毕;
3) 最后redis服务器(父进程)接收到子进程创建的RDB文件,BGSAVE执行完毕;

BGSAVE执行过程:

SAVE和BGSAVE对比

注意:两者并没有谁好谁坏之分,各自适用于不同的场景。

2.3 自动创建RDB文件

以上介绍的SAVE和BGSAVE均需要手工介入。Redis服务器提供了自动进行RDB持久化操作,redis提供了save配置选项,通过这个选项,用户可以设置任意多个保存条件,每当保存条件中的任意一个被满足时,服务器就会自动执行BGSAVE命令。
save选项的格式:

save <seconds> <changes>

描述:如果距离上一次创建RDB文件已经过去seconds秒,并且服务器的所有数据库总共已经发生了不少于changes次修改(添加/删除/更新),那么执行BGSAVE。

示例:

save  

表示距离上一次创建RDB文件已经过去了300秒,并且服务器的所有数据库总共发生了不少于10次修改,那么执行BGSAVE命令;

save  

表示距离上一次创建RDB文件已经过去了60秒,并且服务器的所有数据库总共发生了不少于10000次修改,那么执行BGSAVE命令;

save
save
save

主要三个条件中的任意一个满足时,redis服务器就自动执行BGSAVE命令。

每次创建RDB文件之后,服务器为实现自动持久化而设置的时间计数器和次数计数器就会被清零,并重新开始计数,所以所个保存条件的效果是不会叠加的

Redis数据持久化之RDB持久化的更多相关文章

  1. 使用AOF持久化文件实现还原Redis数据库并得到RDB持久化文件

    目录 1 编写本文的初衷 2 具体实施 2.1 Redis持久化概念简介 2.2 获取指定Redis的AOF持久化文件 2.3 把Redis的持久化AOF文件转换为RDB文件 1 编写本文的初衷 因为 ...

  2. Redis 详解 (六) RDB 持久化

    目录 1.RDB 简介 2.触发方式 ①.自动触发 ②.手动触发 3.恢复数据 4.停止 RDB 持久化 5.RDB 的优势和劣势 6.RDB 自动保存的原理  前面我们说过,Redis 相对于 Me ...

  3. [Redis] redis数据备份恢复与持久化

    数据库备份,使用save命令,将会在redis的安装目录中生成dump.rdb 例如:在我的目录下 redis/src/dump.rdb 使用命令config get dir,获取当前redis的安装 ...

  4. Redis数据持久化、数据备份、数据的故障恢复

    1.redis持久化的意义----redis故障恢复 在实际的生产环境中,很可能会遇到redis突然挂掉的情况,比如redis的进程死掉了.电缆被施工队挖了(支付宝例子)等等,总之一定会遇到各种奇葩的 ...

  5. Redis持久化之RDB&&AOF的区别

    在说Redis持久化之前,需要搞明白什么是数据库状态这个概念,因为持久化的就是将内存中的数据库状态保存到磁盘上.那么什么是数据库状态呢?Redis是一个key-value数据库服务器,一般默认是有16 ...

  6. 【Redis】Redis学习(七) Redis 持久化之RDB和AOF

    Redis 持久化提供了多种不同级别的持久化方式:一种是RDB,另一种是AOF. RDB 持久化可以在指定的时间间隔内生成数据集的时间点快照(point-in-time snapshot). AOF ...

  7. redis——持久化方式RDB与AOF分析

    https://blog.csdn.net/u014229282/article/details/81121214 redis两种持久化的方式 RDB持久化可以在指定的时间间隔内生成数据集的时间点快照 ...

  8. redis系列:RDB持久化与AOF持久化

    前言 什么是持久化? 持久化(Persistence),即把数据(如内存中的对象)保存到可永久保存的存储设备中(如磁盘).持久化的主要应用是将内存中的对象存储在数据库中,或者存储在磁盘文件中.XML数 ...

  9. Redis实现之RDB持久化(一)

    RDB持久化 Redis是一个键值对数据库服务器,服务器中通常包含着任意个非空数据库,而每个非空数据库中又可以包含任意个键值对,为了方便起见,我们将服务器中的非空数据库以及它们的键值对统称为数据库状态 ...

随机推荐

  1. Java异常之checked与unchecked

    首先,java的异常分为Error和Exception.这两类都是接口Throwable的子类.Error及Exception及其子类之间的关系,大致可以用下图简述. 注意事项: 1. Error仅在 ...

  2. [转]session缓存机制和三种对象状态

    摘自 http://blog.csdn.net/csh624366188/article/details/7612142 Hibernate 的Session就是其中的一个,它提供了基本的增,删,改, ...

  3. 【转】Asp.Net MVC3 简单入门详解过滤器Filter

    原文地址:http://www.cnblogs.com/boruipower/archive/2012/11/18/2775924.html 前言 在开发大项目的时候总会有相关的AOP面向切面编程的组 ...

  4. HTML5显示地图例子

    html 5获取GPS位置,Google地图显示 场景: JQuery Mobile 代码片段: <script type="text/javascript"> $(' ...

  5. LintCode "Count of Smaller Number before itself"

    Warning: input could be > 10000... Solution by segment tree: struct Node { Node(), left(nullptr), ...

  6. (转)在Winform程序中设置管理员权限及为用户组添加写入权限

    本文转载自:http://www.cnblogs.com/wuhuacong/p/5645172.html 在我们一些Winform程序中,往往需要具有一些特殊的权限才能操作系统文件,我们可以设置运行 ...

  7. RabbitMQ和Kafka

    转自通九大神的博客 起因 最近公司RabbitMQ的集群出了点问题,然后有些亲就说RabbitMQ慢且不好用,是一个瓶颈,不如换成Kafka.而我本人,使用RabbitMQ有一点久了,认为这个事情应当 ...

  8. 目前已经知道的乐视所有产品各个型号的强刷方法!更新X50

    http://ui.letv.com/thread-43668-1-1.html 很多网友买来电视/盒子仅仅要看,还要折腾这个电视,有时候不小心把系统折腾死了,肿么办?危难之中显身手,我的神帖来了,敬 ...

  9. C语言每日一题之No.2

    题目:已知三个整型数8,12,6,按公式s=a+b*c计算,并显示结果 思路:定义三个整型变量a,b,c 定义一个变量s用来保存运算结果 输出 程序: #include <stdio.h> ...

  10. Linux下高并发socket最大连接数所受的各种限制

    http://blog.csdn.net/guowake/article/details/6615728 1.修改用户进程可打开文件数限制 在Linux平台上,无论编写客户端程序还是服务端程序,在进行 ...