核心知识点:

1.RDB:将当前数据生成快照保存到硬盘

2.手动触发

  save:会阻塞Redis服务器直到RDB完成。

  bgsave:执行fork创建子进程,由子进程负责RDB操作,阻塞只发生在fork创建子进程期间

3.自动触发

  a.设置save m n

  b.执行全量复制,自动执行bgsave

  c.debug reload会自动触发save

  d.执行shutdown没有开启AOF就会执行bgsave

4.文件处理:

  a.保存:config set dir/dbfilename

  b.压缩:LZF算法,大大降低文件体积

  c.校验

5.优缺点

(1)优点:适合备份和全量复制;恢复数据的速度比AOF块。

(2)缺点:不能实时持久化/秒级持久化,fork属于重量级操作;版本兼容问题

Redis支持RDBAOF两种持久化机制,持久化功能有效地避免因进程退出造成地数据丢失问题,

当下次重启时利用之前持久化的文件即可以实现数据恢复。本节主要介绍RDB持久化的机制。

RDB持久化是把当前进程数据生成快照保存到硬盘的过程,触发RDB持久化过程分为手动触发和自动触发。

1.触发机制

手动触发分别对应save和bgsave命令:

(1)save

save命令会阻塞当前的Redis服务器,直到RDB过程完成为止,对于内存较大的实例会造成长时间的阻塞,线上环境不建议使用。

(2)bgsave

bgsave命令:Redis进程执行fork操作创建子进程,RDB持久化过程由子进程负责,完成后自动结束。

阻塞只发生在fork阶段,一般时间很短。

显然bgsave命令是针对save阻塞问题做的优化,因此Redis内部所有涉及RDB的操作都采用bgsave的方式,而save命令因此废弃。

除了执行命令手动触发之外,Redis内部还存在自动触发RDB的持久化机制,例如以下场景:

  • 使用save相关设置,如“save m n”。表示m秒内数据集在n次修改时,自动触发bgsave。
  • 如果从节点执行全量复制操作,主节点自动执行bgsave生成RDB文件并发送给从节点。
  • 执行debug reload命令重新加载Redis时,也会自动触发save操作。
  • 默认情况下执行shutdown命令时,如果没有开启AOF持久化功能则自动执行bgsave。

2.流程说明

bgsave是主流的触发RDB持久化方式,下面是它的运作流程:

(1)执行bgsave命令,Redis父进程判断当前是否存在正在执行的子进程,如RDB/AOF子进程,如果存在bgsave命令直接返回。

(2)父进程执行fork操作创建子进程,fork操作过程中父进程会阻塞,通过info stats命令查看lastest_fork_usec选项,

  可以获取最近一个fork操作的耗时,单位为微秒。

(3)父进程fork完成后,bgsave命令返回“Background saving started”信息并不再阻塞子进程,可以继续响应其它命令。

(4)子进程创建RDB文件,根据父进程内存生成临时快照文件,完成后对原有文件进行原子替换。

  执行lastsave命令可以获取最后一次生成RDB的时间,对应info统计的rdb_last_save_time选项。

(5) 进程发送信号给父进程表示完成,父进程更新统计信息,具体见info_Persistence下的rdb_*相关选项。

3.RDB文件的处理

(1)保存

RDB文件保存在dir配置指定的目录下,文件名通过dbfilename配置指定。

可以通过执行config set dir {newDir}和config set dbfilename {newFileName}运行期动态执行,当下次运行时RDB文件会保存在新目录。

注意:

当遇到坏盘或磁盘写满等情况,可以通过config set dir{new Dir}在线修改文件路径到可用的磁盘路径,

之后执行bgsave进行磁盘切换,同样适用于AOF持久化文件。

(2)压缩

Redis默认采用LZF算法对生成的RDB文件进行压缩处理,压缩后的文件远远小于内存大小,

默认开启,可以通过参数config set rdbcompression {yes|no}动态修改。

注意:

虽然压缩RDB会消耗CPU,但可大幅降低文件体积,方便保存到磁盘或通过网络发送给节点,因此线上环境建议。

(3)校验

如果Redis加载损坏的RDB文件时拒绝启动,这时可以使用Redis提供的redis-check-dump工具检验RDB文件并获取对应的错误信息。

4.RDB的优缺点

(1)RDB的优点

第一、RDB是一个紧凑压缩的二进制文件,代表Redis在某个时间上的数据快照。非常适合用于备份、全量复制等场景。

比如,每6个小时执行bgsave备份,并把RDB文件拷贝到远程机器或文件系统中,用于灾难恢复。

第二、Redis加载RDB恢复数据远远快于AOF的方式。

(2)RDB的缺点

第一、RDB方式数据没办法做到实施持久化/秒级持久化。因为bgsave每次运行都要执行fork操作创建子进程,

  属于重量级操作,频繁执行成本过高。

第二、RDB文件使用特定二进制格式保存,Redis版本演进过程中有多个格式的RDB版本,

  存在老版本Redis服务无法兼容新版本RDB格式的问题。

Redis持久化——RDB(一)的更多相关文章

  1. Linux - redis持久化RDB与AOF

    目录 Linux - redis持久化RDB与AOF RDB持久化 redis持久化之AOF redis不重启,切换RDB备份到AOF备份 确保redis版本在2.2以上 实验环境准备 备份这个rdb ...

  2. Redis持久化rdb&aof

    Redis持久化rdb&aof 前言 持久化:即把数据存储于断电后不会丢失的设备中,通常是硬盘 常见的持久化方式: 主从:通过从服务器保持持久化,如mongoDB的replication se ...

  3. Redis持久化----RDB和AOF 的区别

    关于Redis说点什么,目前都是使用Redis作为数据缓存,缓存的目标主要是那些需要经常访问的数据,或计算复杂而耗时的数据.缓存的效果就是减少了数据库读的次数,减少了复杂数据的计算次数,从而提高了服务 ...

  4. redis持久化 RDB与AOF

    redis持久化 RDB与AOF RDB与AOF区别 rdb: 基于快照的持久化,速度更快,一般用做备份,主从复制也是依赖于rdb持久化功能 aof:以追加的方式记录redis操作日志的文件,可以最大 ...

  5. redis持久化RDB和AOF

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

  6. 4、解析配置文件 redis.conf、Redis持久化RDB、Redis的主从复制

    1.Units单位 配置大小单位,开头定义了一些基本的度量单位,只支持bytes,不支持bit 对大小写不敏感 2.INCLUDES包含 和我们的Struts2配置文件类似,可以通过includes包 ...

  7. redis持久化RDB与AOF

    redis持久化 Redis是一种内存型数据库,一旦服务器进程退出,数据库的数据就会丢失,为了解决这个问题,Redis提供了两种持久化的方案,将内存中的数据保存到磁盘中,避免数据的丢失. RDB持久化 ...

  8. redis持久化 (rdb

    RDB(快照持久化) RDB(redis database),可以理解为快照/内存快照,RDB持久化过程是将当前进程中的数据生成快照存储到硬盘中 触发机制RDB持久化的触发机制分为两种,手动触发和自动 ...

  9. 配置方案:Redis持久化RDB和AOF

    Redis持久化方案 Redis是内存数据库,数据都是存储在内存中,为了避免进程退出导致数据的永久丢失,需要定期将Redis中的数据以某种形式(数据或命令)从内存保存到硬盘.当下次Redis重启时,利 ...

  10. Redis持久化--RDB+AOF(转)

    1.Redis两种持久化方式 RDB 执行机制:快照,直接将databases中的key-value的二进制形式存储在了rdb文件中 优点:性能较高(因为是快照,且执行频率比aof低,而且rdb文件中 ...

随机推荐

  1. ionic开发之优化目录结构

    当我们来个ionic start circleApp tabs的时候,会自动生成目录结构,基本如下: 显然这不利于项目的管理,当你的项目越来越复杂的时候,这是不够的.我们必须要按照模块进行文件夹的方式 ...

  2. List装form

    List<MemberPrivilegeForm> formlist = new ArrayList<MemberPrivilegeForm>(); int status = ...

  3. react-native 启动页(react-native-splash-screen)

    用于解决iOS和Android启动白屏问题及简单的启动页面展示 下载 react-native-splash-screen yarn add react-native-splash-screen re ...

  4. Eclipse 使用 SVN 插件后改动用户方法汇总

    判定 SVN 插件是哪个 JavaH 的处理方法 SVNKit 的处理方法 工具自带改动功能 删除缓存的秘钥文件 其他发表地点 判定 SVN 插件是哪个 常见的 Eclipse SVN 插件我知道的一 ...

  5. group by having和connect by

    --使用group by 子句对数据进行分组:对group by 子句形成的组运行聚集函数计算每一组的值:最后用having 子句去掉不符合条件的组.--having 子句中的每一个元素也必须出现在s ...

  6. CDN与缓存的归纳理解

    缓存是什么 缓存是一个到处都存在的用空间换时间的例子.通过使用多余的空间,我们能够获取更快的速度. 我们通常意义上说的缓存主要包含两部分.第一个是用户浏览器端的缓存,第二个是服务器端为了提高访问速度而 ...

  7. $on、$emit和$broadcast的使用

    $emit只能向parent controller传递event与data( $emit(name, args) ) $broadcast只能向child controller传递event与data ...

  8. json字符串传值到后台出现乱码的问题的解决方法

    1.原因:前台的编码是ISO-8859-1,后台的编码是UTF-8,所以会冲突 2.解决方法:先用ISO-8859-1解码成字节数组,再转成UTF-8编码格式 String strw = new St ...

  9. Winform 动态 画图 不闪

    一.问题:解决winform动态画图闪的问题,网上搜的方法,大部分都是: “this.SetStyle(ControlStyles.OptimizedDoubleBuffer | ControlSty ...

  10. Sphinx(Coreseek)安装和使用指南

    1.安装 1.1安装mmseg ./bootstrap # 必须执行,不然安装会失败 ./configure --prefix=/usr/local/mmseg- #指定安装目录 make make ...