Redis RDB学习笔记(你想要的我都有)

Posted 鸣蜩铃兰香

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Redis RDB学习笔记(你想要的我都有)相关的知识,希望对你有一定的参考价值。

文章目录


1、什么是RDB

RDB方式是怎样的? redis会单独创建(fork)一个子进程来进行持久化,将redis某一时刻的数据持久化到磁盘中,是一种快照式的持久化方法,这个时候主进程是不会进行任何IO操作的,这样就确保了redis极高的性能;redis在进行数据持久化的过程中,会先将数据写入到一个临时文件中,待持久化过程都结束了,才会用这个临时文件替换上次持久化好的文件。正是这种特性,让我们可以随时来进行备份,因为快照文件总是完整可用的。

那么为什么 Redis 使用子进程而不是线程来进行后台 RDB 持久化呢? 主要是出于Redis性能的考虑,因为Redis对客户端响应请求的工作模型是单进程和单线程的,所以如果在主进程内启动一个线程,这样会造成对数据的竞争条件。所以为了避免使用锁降低性能,Redis选择启动新的子进程,独立拥有一份父进程的内存拷贝,以此为基础执行RDB持久化。

启动时加载, RDB文件的载入工作是在服务器启动时自动执行的,将数据从硬盘载入到内存,根据数据量大小与结构和服务器性能不同,这个时间也不同。通常将一个记录一千万个字符串类型键、大小为1GB的快照文件载入到内 存中需要花费20~30秒钟,其中并没有专门的命令。但是由于AOF的优先级更高,因此当AOF开启时,Redis会优先载入AOF文件来恢复数据;只有当AOF关闭时,才会在Redis服务器启动时检测RDB文件,并自动载入。服务器载入RDB文件期间处于阻塞状态,直到载入完成为止。Redis载入RDB文件时,会对RDB文件进行校验,如果文件损坏,则日志中会打印错误,Redis启动失败。

2、RDB是怎么执行的


当条件满足,redis需要执行RDB的时候,服务器会执行以下操作:

1、Redis 父进程首先判断: 当前是否在执行 save ,或 bgsave/bgrewriteaof ( aof 文件重写命令)的子进程,如果在执行则bgsave 命令直接返回。bgsave/bgrewriteaof 的子进程不能同时执行,主要是基于性能方面的考虑:两个并发的子进程同时执行大量的磁盘写操作,可能引起严重的性能问题。

2、父进程执行 fork (调用 OS函数复制主进程)操作创建子进程,这个复制过程中父进程是阻塞的,Redis不能执行来自客户端的任何命令。

3、父进程 fork 后, bgsave 命令返回”Background saving started”信息并不再阻塞父进程,并可以响应其他命令。

4、当子进程完成对临时RDB文件的写入时, redis 用新的临时RDB 文件替换原来的RDB 文件,并删除旧 RDB 文件。

5、子进程发送信号给父进程表示完成,父进程更新统计信息。

6、父进程 fork 子进程后,继续工作。

自动触发 RDB 的默认配置如下所示:

save 3600 1 # 表示3600 秒内如果至少有 1 个 key 的值变化,则触发RDB
save 300 10 # 表示300 秒内如果至少有 10 个 key 的值变化,则触发RDB
save 60 10000 # 表示60 秒内如果至少有 10000 个 key 的值变化,则触发RDB

3、RDB的优、缺点

3.1 优点

1、rdb持久化文件很紧凑,占用空间更小。
2、rdb保存的是基于时间点的数据快照,更适合数据的备份和容灾
3.利用rdb文件进行数据恢复时,速度更快

如果需要进行大规模数据的恢复,且对于数据恢复的完整性不是非常敏感,那RDB方式要比AOF方式更加的高效。

3.2 缺点

1、会造成部分数据的丢失
2、当数据集非常大时,fork操作会占用很多系统资源,造成主服务进程假死

虽然RDB有不少优点,但它的缺点也是不容忽视的。如果你对数据的完整性非常敏感,那么RDB方式就不太适合你,因为即使你每5分钟都持久化一次,当redis故障时,仍然会有近5分钟的数据丢失。所以,redis还提供了另一种持久化方式,那就是AOF。

4、RDB文件

rdb文件是经过压缩的文件,占用的空间比较小,更有利于传输,并且数据恢复速度也比较快。

RDB文件的存储路径既可以在启动前配置(默认是Redis根目录下的dump.rdb文件)。也可以通过命令动态设定。
配置:

dir  配置指定目录

dbfilename  指定文件名。

动态设定:Redis启动后也可以动态修改RDB存储路径,在磁盘损害或空间不足时非常有用;执行命令为

config set dir newdir和config set dbfilename newFileName

**

4.1 RDB文件结构

  1. REDIS:常量,保存着”REDIS”5个字符。

  2. db_version:RDB文件的版本号,注意不是Redis的版本号。

  3. SELECTDB 0 pairs:表示一个完整的数据库(0号数据库),同理SELECTDB 3 pairs表示完整的3号数据库;只有当数据库中有键值对时,RDB文件中才会有该数据库的信息(上图所示的Redis中只有0号和3号数据库有键值对);如果Redis中所有的数据库都没有键值对,则这一部分直接省略。其中:SELECTDB是一个常量,代表后面跟着的是数据库号码;0和3是数据库号码;pairs则存储了具体的键值对信息,包括key、value值,及其数据类型、内部编码、过期时间、压缩信息等等。

  4. EOF:常量,标志RDB文件正文内容结束。

  5. check_sum:前面所有内容的校验和;Redis在载入RBD文件时,会计算前面的校验和并与check_sum值比较,判断文件是否损坏。
    Redis默认采用LZF算法对RDB文件进行压缩。虽然压缩耗时,但是可以大大减小RDB文件的体积,因此压缩默认开启;可以通过命令关闭:

config  set  rdbcompression  no

5、RDB常用配置总结

下面是RDB常用的配置项,以及默认值。

save m n: bgsave自动触发的条件;如果没有save m n配置,相当于自动的RDB持久化关闭,不过此时仍可以通过其他方式触发

stop-writes-on-bgsave-error yes: 当bgsave出现错误时,Redis是否停止执行写命令;设置为yes,则当硬盘出现问题时,可以及时发现,避免数据的大量丢失;设置为no,则Redis无视bgsave的错误继续执行写命令,当对Redis服务器的系统(尤其是硬盘)使用了监控时,该选项考虑设置为no

rdbcompression yes: 是否开启RDB文件压缩

rdbchecksum yes: 是否开启RDB文件的校验,在写入文件和读取文件时都起作用;关闭checksum在写入文件和启动文件时大约能带来10%的性能提升,但是数据损坏时无法发现。

dbfilename dump.rdb: RDB文件名

dir ./: RDB文件和AOF文件所在目录

6、RDB模式适用的场景

1、数据备份
3、可容忍部分数据丢失
3、跨数据中心的容灾备份
4、数据呈现阶段有效性,建议使用RDB持久化方案,数据可以良好的做到阶段内无丢失(该阶段是开发者或运维人工手工维护的),且恢复速度较快,阶段点数据恢复通常采用RDB方案

注意:利用RDB实现紧凑的数据持久化会使Redis降得很低


By:本文查阅了一些博主的文章整理,嘿 ~

以上是关于Redis RDB学习笔记(你想要的我都有)的主要内容,如果未能解决你的问题,请参考以下文章

程序员面试系列手把手教你如何面试,你要的我都有(工作项目篇)

Redis深入学习笔记RDB及AOF流程

Redis6.x学习笔记持久化之RDB

学习笔记-Redis设计与实现-RDB持久化

Redis学习笔记—持久化机制之RDB

redis源码学习持久化机制:RDB