一.概述

  Redis是内存数据库,一旦服务器进程退出,服务器中的数据库内存数据状态也会消失。为了解决这个问题,Redis提供了RDB 持久化功能,这个功能可以将redis在内存中的数据库状态保存到磁盘中,避免数据意外丢失。

  RDB持久化可以手动执行,也可以根据服务器配置选项定期执行,是在指定的时间间隔,对你的数据进行快照存储。该RDB文件快照是一个经过压缩的二进制文件。文件名为dump.rdb,该文件保存在redis目录下,当redis服务器停机后,只要RDB文件存在,下次重启Redis服务时就会自动还原数据库数据状态。

  1.1 RDB文件的创建

    通过Redis两个命令来生成RDB文件,一是SAVE,另一个是BGSAVE。SAVE命令是会阻塞Redis服务器进程,直到RDB文件创建完毕为止,在阻塞期间,服务器不能处理任何命令请求。

    127.0.0.1:> save   -- 等待RDB文件创建完毕
OK

    与SAVE不同,BGSAVE命令会派生出一个子进程,然后由子进程负责创建RDB文件,服务器进程(父进程)继续处理命令请求。当BGSAVE命令在执行期间,客户端再发送BGSAVE命令会被服务器拒绝,因为同时执行两个GBSAVE命令也会产生竞争条件。最后BGREWRITEAOF和GBSAVE两个命令也不能同时执行。

    127.0.0.1:> bgsave  --派生子进程,并由子进程创建RDB文件
Background saving started

  

  1.2 RDB文件载入

    和创建文件不同,RDB文件的载入是在服务器启动时自动执行的,并没有用于载入RDB文件的命令,只要Redis服务器在启动时检测到RDB文件的存在,它就会自动载入RDB文件。能过启动时日志记录可以查看。需要注意的是,如果打开了AOF持久化,那么服务器会优先使用AOF文件来还原数据库状态。

  

  1.3 自动间隔性保存

    文件的创建除了SAVE和GBSAVE保存RDB 文件,还可以通过配置SAVE选项,让服务器每隔一段时间自动执行一次BGSAVE命令。可以配置SAVE选项设置多个保存条件,只要任意一个条件被满足,服务器就会执行BGSAVE命令。

    --默认配置的SAVE选项,保存方式有三种条件,满足任意一种就可以,如下:
127.0.0.1:> config get save
) "save"
) "900 1 300 10 60 10000"

    (1) 服务器在900秒之内,对数据库进行了至少1次修改。

    (2) 服务器在300秒之内,对数据库进行了至少10次修改。

    (3) 服务器在60秒之内,对数据库进行了至少10000次修改。

  1.4 检查保存条件是否满足

    Redis的服务器周期性操作默认每隔100毫秒就会检查执行一次,用于对正在运行的服务器进行维护,其中一项工作是检查save 选项所设置的保存条件是否已经满足,如果满足就调用BGSAVE命令。

  1.5  RDB工作方式

    当Redis需要保存dump.rdb文件时,服务器执行以下操作:

    (1)Redis调用forks. 同时拥有父进程和子进程。

    (2)子进程将数据集写入到一个临时 RDB 文件中。

    (3)当子进程完成对新 RDB 文件的写入时,Redis用新 RDB 文件替换原来的 RDB 文件,并删除旧的 RDB 文件。

  

  1.6  RDB 文件结构

    下面简单了解一下RDB文件结构,这里不再深入了解。下面脚本显示了本机dump.rdb文件的位置。该rdb文件结构中各部分 如下图表格所示:

    [root@xuegod64 redis]# pwd
/usr/local/redis
[root@xuegod64 redis]# ls -l
-rwxrwxrwx root root 11月 : dump.rdb

文件结构各部份

描述

redis

RDB文件最开头是REDIS部分,保存五个字符,程序在载入文件时,快速检查所载入的文件是否是RDB文件

Db_version

一个字符串表示的整数,4个字节,记录了RDB文件的版本号

databases

该部份包含着0个或任意多个数据库,以及各数据库中的键值对数据

Eof

占1个字节,标志着RDB文件正文内容的结束,当程序遇到这个值的时候,就知道所有数据库的所有键值对都已经载入完毕了

Check_sum

占8字节的无符号整数,保存一个校验和,通过前四部分内容进行计算得出。用来检查RDB文件是否出错或者损坏

    下面通过linux的od命令来查看redis服务器产生的RDB 文件,并指定-c参数可以以ASCII编码方式打印信息。信息中能直接看到的信息是:第一部分是redis,  Db_version部分是0008, Eof部分是372 。

  

  1.7  RDB优势

    (1) RDB是一个非常紧凑的文件,它保存了某个时间点得数据集,非常适用于数据集的备份,比如你可以在每个小时报保存一下过去24小时内的数据,同时每天保存过去30天的数据,这样即使出了问题你也可以根据需求恢复到不同版本的数据集。

    (2)RDB是一个紧凑的单一文件,很方便传送到另一个远端数据中心,非常适用于灾难恢复。

    (3)RDB在保存RDB文件时父进程唯一需要做的就是fork出一个子进程,接下来的工作全部由子进程来做,父进程不需要再做其他IO操作,所以RDB持久化方式可以最大化redis的性能。

    (4)与AOF相比,在恢复大的数据集的时候,RDB方式会更快一些。

  

  1.8  RDB缺点

    (1)如果数据不允许任何丢失,那么RDB不适合(虽然可以配置不同的save时间点)。

    (2)经常fork子进程来保存数据集到硬盘上,当数据集比较大的时候,fork的过程是非常耗时的,可能会导致Redis在一些毫秒级内不能响应客户端的请求。

二. RDB持久化测试

    (1) 首先关闭redis服务。当关闭服务时报错,首先检查一下是否是权限的问题,因为在shutdown命令的时候,会进行save操作,而save需要操作dump.rdb文件,如果没有权限则会报这个错。

    [root@xuegod64 redis]# redis-cli shutdown
(error) ERR Errors trying to SHUTDOWN. Check logs
-- 需要放开对dump.rdb文件的写入权限,服务关闭成功
[root@xuegod64 redis]# redis-cli shutdown
[root@xuegod64 redis]# redis-cli

    (2) 服务启动,首先set 写入一条数据,然后关闭服务进程。

    [hsr@xuegod64 redis]$ redis-serverredis.conf
127.0.0.1:> set name "test"
OK
127.0.0.1:> get name
"test"
127.0.0.1:> exit
[hsr@xuegod64 redis]$ redis-cli shutdown

    (3)重次重启服务,查看持久化

    查看刚才的键值对,发现键值对已存在,说明数据持久化保存到了磁盘中,原理是在关闭服务时,会先调用save操作,保存到dump.rdb文件中,在重启服务后,加载dump.rdb文件。

    [hsr@xuegod64 redis]$ redis-serverredis.conf
[hsr@xuegod64 redis]$ redis-cli
127.0.0.1:> get name
"test"

   

  总结:作为RDB快照持久化,如果是正常关闭redis服务,再重启后数据是不会丢失的,但如果系统崩溃或者强杀,用户将会丢失最近一次生成快照之后更改的所有数据。

  

  

redis 系列16 持久化 RDB的更多相关文章

  1. Redis之数据持久化RDB与AOF

    Redis之数据持久化RDB与AOF https://www.cnblogs.com/zackku/p/10087701.html 大家都知道,Redis之所以性能好,读写快,是因为Redis是一个内 ...

  2. 进阶的Redis之数据持久化RDB与AOF

    大家都知道,Redis之所以性能好,读写快,是因为Redis是一个内存数据库,它的操作都几乎基于内存.但是内存型数据库有一个很大的弊端,就是当数据库进程崩溃或系统重启的时候,如果内存数据不保存的话,里 ...

  3. Redis系列(四)--持久化

    持久化就是将数据的更新异步的保存到磁盘中 持久化方式: 1.快照:某个时间点数据的备份 MySQL dump.Redis RDB 2.写日志:MySQL BinLog.HBASE Hlog.Redis ...

  4. 深入理解Redis系列之持久化

    redis持久化配置 redis.conf // RDB配置 save 900 1 save 300 10 save 60 10000 // AOF配置 appendonly yes //AOF三种同 ...

  5. redis 系列17 持久化 AOF

    一.概述 除了上篇介绍的RDB持久化功能之外,Redis还提供了AOF(Append Only File)持久化功能.与RDB保存数据库中的键值对来记录数据库状态不同,AOF是通过保存redis服务器 ...

  6. Redis的快照持久化-RDB与AOF

    Redis持久化功能 Redis为了内部数据的安全考虑,会把本身的数据以文件形式保存到硬盘中一份,在服务器重启之后会自动把硬盘的数据恢复到内存(redis)的里边. 数据保存到硬盘的过程就称为“持久化 ...

  7. 二、redis系列之持久化

    1. 绪言 redis是一种内存数据库,它把数据存储在服务器的内存当中,这样极大地保证了redis数据库的性能,但也为数据安全带来了隐患——redis所在服务器重启或者发生宕机后,redis数据库里的 ...

  8. redis学习之——持久化RDB 和AOF

    RDB: 在指定的时间间隔内将内存中的数据集快照写入磁盘, 也就是行话讲的Snapshot快照,它恢复时是将快照文件直接读到内存里.rdb 保存的是dump.rdb文件 RDB工作原理: Redis会 ...

  9. 【目录】redis 系列篇

    随笔分类 - redis 系列篇 redis 系列27 Cluster高可用 (2) 摘要: 一. ASK错误 集群上篇最后讲到,对于重新分片由redis-trib负责执行,关于该工具以后再介绍.在进 ...

随机推荐

  1. numpy库补充 mean函数应用

    mean()函数功能:求取均值经常操作的参数为axis,以m * n矩阵举例: axis 不设置值,对 m*n 个数求均值,返回一个实数 axis = 0:压缩行,对各列求均值,返回 1* n 矩阵 ...

  2. 蓝桥杯刷题,第四界省赛B组

    题头,本内容的题目和部分内容均来自博客:https://blog.csdn.net/ryo_218/article/details/79704030 ,在此感谢. 1. 题目标题:高斯日记大数学家高斯 ...

  3. [jzoj]3468.【NOIP2013模拟联考7】OSU!(osu)

    Link https://jzoj.net/senior/#main/show/3468 Description osu 是一款群众喜闻乐见的休闲软件. 我们可以把osu的规则简化与改编成以下的样子: ...

  4. C#中添加log4net(日志文件)

    1.先下载引用“log4net” 2.然后再App.config配置 3.添加一个LogHandler类 4.在Assemblyinfo类中添加配置的读取文件 5.运用日志文件 6.显示结果

  5. 多阶段构建Docker镜像

    在Docker 17.05及更高的版本中支持支持一种全新的构建镜像模式:多阶段构建: 多阶段构建Docker镜像的最大好处是使构建出来的镜像变得更小: 目前常见的两个构建镜像的方式为: 1.直接使用某 ...

  6. 《SpringMVC从入门到放肆》八、SpringMVC注解式开发(基本配置)

    上一篇我们结束了配置式开发,配置式开发目前在企业中用的并不是很多,大部分企业都在使用注解式开发,所以今天我们就来学习注解式开发.所谓SpringMVC注解式开发是指,处理器是基于注解的类的开发方式.对 ...

  7. 【C语言】多项式加法(mooc第七周测试题)

    这个小题目吧我折磨的够呛,,主要在于特殊情况考虑不周,测试用例老是通不过.. 小结: 做法:用一个数组来存储多项式,用下标表示幂次数,数组元素值表示对应系数 输出特殊格式考虑:系数和幂次数为0,1,- ...

  8. 2019中山大学程序设计竞赛-Monitor

    题目地址 题目大意:给你一个n*m的矩形,在这个矩形内告诉你p个矩形(左下角和右上角坐标),问你q个问题,每次也是给你一个矩形(左下角和右上角坐标),问你每个矩形是否可以被开始给的p个矩形完全覆盖. ...

  9. Oracle 的开窗函数 rank,dense_rank,row_number

    1.开窗函数和分组函数的区别 分组函数是指按照某列或者某些列分组后进行某种计算,比如计数,求和等聚合函数进行计算. 开窗函数是指基于某列或某些列让数据有序,数据行数和原始数据数相同,依然能曾现个体数据 ...

  10. 整理4种Vue组件通信方式

    整理4种Vue组件通信方式 重点是梳理了前两个,父子组件通信和eventBus通信,我觉得Vue文档里的说明还是有一些简易,我自己第一遍是没看明白. 父子组件的通信 非父子组件的eventBus通信 ...