Redis中RDB持久化,想进阶的,点进来!

335 阅读3分钟
原文链接: mp.weixin.qq.com

(👆点击上面的公众号,可快速关注哦!👆)

Redis之所以高性能,主要原因是Redis是基于内存读写的。内存读写的速度都是极快的,所以用Redis执行 set、get操作时,耗时在微秒级的(不考虑数据大小的传输时延)。

我们知道内存断电会丢数据,所以接下来我们来介绍Redis的持久化机制中的一个--RDB持久化。

该功能可以将某个时间点上的数据库状态保存到一个RDB文件中。如下图

RDB所生成的文件是一个经过压缩的二进制文件,通过该文件可以还原成RDB文件时的数据库状态。如下图

RDB是保存在硬盘里面的,即使Redis进程退出,甚至主机停机,只要RDB文件存在,Redis服务器就可以用它还原数据库状态。

RDB执行方式

手动执行

通过服务器的配置选项,自动执行

有两个Redis命令用于生成RDB文件,一个是SAVE,另一个是BGSAVE 。

SAVE会阻塞Redis服务器进程,直到RDB文件创建完毕为止,在服务器进程阻塞期间,服务器不能处理任何命令请求 。

127.0.0.1:6379> SAVE

OK

BGSAVE会派生出一个子进程,然后由子进程负责创建RDB文件。

127.0.0.1:6379> BGSAVE

Background saving started

SAVE和BGSAVE命令不仅可以直接进行手动执行,我们还可以通过修改Redis的配置文件中的save选项,让服务器每隔一段时间自动执行一次BGSAVE,来达到自动生成RDB的目的。

我们可以在save选项中设置多个保存条件,但只要其中任意一个条件被满足,服务器就会执行BGSAVE命令。

例如,我们向服务器提供以下配置:

save 900 1

save 300 10

save 60 10000

那么服务器只要满足以下三个条件中的任意一个,BGSAVE命令就会被执行:

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

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

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

Redis服务器内部会维持一个计数器dirty、时间戳lastsave 、守护计时器time。

  • dirty计数器记录离上一次成功执行SAVE命令或者BGSAVE命令之后,服务器对数据库状态(服务器中的所有数据库)进行了多少次的修改(写入、删除、更新等操作),当服务器成功执行一个数据库修改命令之后,程序就会对dirty计数器进行更新:命令修改了多少次数据库,dirty计数器的值就增加多少。

  • lastsave属性是一个UNIX时间戳,记录了服务器上一次成功执行SAVE或者BGSAVE命令的时间。

  • time是周期性执行的服务器计时器,周期默认是100毫秒,在周期执行的任务中就包括检查是否满足save选项所设置的条件,如果满足的话,就执行BGSAVE命令。

参考资料

《Redis的设计与实现》黄建宏

想学习更多内容的,可以长按扫描下面的二维码哦👇