(👆点击上面的公众号,可快速关注哦!👆)
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的设计与实现》黄建宏
想学习更多内容的,可以长按扫描下面的二维码哦👇