redis系列

redis系列(三):RDB持久化

2020-05-30  本文已影响0人  范柏柏

redis是内存数据库,他将自己的数据库状态存储在内存里面,异常退出数据就丢了,所以一定要持久化。这一节主要讲RDB持久化。

首先RDB就是一个文件。他记录了某一个时间点,redis所有数据的快照。

可以手动生成RDB文件,也可以让服务器定期生成RDB文件。

手动生成RDB文件

两个命令:

如果想尝试,直接在命令行敲这两个单词就可以了。

区别:

  1. SAVE是阻塞的,在生成RDB文件的时候,redis阻塞一切指令,相当于停止服务,知道RDB文件生成结束。
  2. BGSAVE是不阻塞的,执行BGSAVE的时候,会在主进程基础上fork一个子进程,当RDB文件生成结束后,通知主进程。注意:fork操作会在创建子进程期间阻塞主进程。

持久化存储,redis不可能让用户手动执行吧。两个命令只是给用户留的口,redis内部肯定有自动执行的策略。

自动保存RDB文件

可以通过配置文件来配置

// 900秒内,对数据库进行了至少1次修改
save 900 1   
// 300秒内,对数据库进行了至少10次修改
save 300 10
// 60秒内,对数据库进行了至少1万次修改
save 60 10000

默认是这三个配置。

通过计数器,秒数,时间戳,循环判断这三个条件,满足其一,就执行一次RDB文件的创建。

当然了,还有两种必然会触发RDB持久化的场景

  1. 执行debug reload命令重新加载redis时,会触发save操作
  2. 执行shutdown命令时,如果没有开启AOF持久化,则自动执行BGAVE。

RDB文件是全量数据的快照。不是增量的。

redis通过RDB文件恢复数据

没有专门用来载入RDB文件的命令。只有在redis服务器启动的时候,检测到有RDB文件,就会自动执行RDB的载入。

但是redis会优先载入AOF文件。如果redis开启了AOF持久化,那直接执行载入AOF文件,RDB文件就废弃了。当redis没有开启AOF持久化功能的时候,服务器才会载入RDB文件。

RDB文件的结构

大写为常量,固定值。小写为变量。


RDB文件结构.png

databases部分

每个数据库的0-15号数据库,都是一个databases


0-15号数据库存储结构.png 每个号的数据库的存储结构.png key_value_pairs.png

TYPE是常量字符串,就是底层数据结构的type。
比如列表类型就是:REDIS_RDB_TYPE_LIST。

key就是数据库的key。
value根据类型,存储值。hash类型就是key/value挨着存。

先是0号数据库,0号数据库的所有key/value一个挨一个存好了。再1号数据库,1号数据库的所有key/value一个挨一个存好了。直到数据库存完了,后面紧挨着一个EOF + 校验和。

RDB 的优势和劣势

优势

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

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

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

劣势

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

上一篇 下一篇

猜你喜欢

热点阅读