redis拾遗(四)——持久化之RDB

前言

redis支持非常丰富的内存数据结构类型,但是这些内存数据如何持久化保存到磁盘上,这是一个不简单的事儿。redis的持久化方法相比传统的数据库有比较多的区别,目前Redis一共支持两种持久化方式

RDB(定时快照方式):将数据库的快照以二进制的方式保存到磁盘

AOF(基于语句追加文件的方式):以协议文本的方式,将所有对数据库进行写入的命令记录到AOF文件,以此达到记录数据库的目的。

本篇博客介绍RDB的持久化方式。

触发方式

手动触发

1、save命令

直接通过客户端调用save命令会将当前的redis数据快照以RDB文件的形式进行保存。但是这个保存是阻塞的。该命令也被基本废弃。

127.0.0.1:6379> save
OK

2、bgsave命令

redis会开启一个线程去保存快照文件,对于客户端来说是异步非阻塞的保存方式。

127.0.0.1:6379> bgsave
Background saving started

自动触发

自动触发其实是基于redis.conf配置文件中的save [m] [n]的参数配置,具体含义是在m秒内,如果redis发生的数据变化次数大于等于n次,则执行bgsave,触发RDB持久化机制。

save 900 1
save 300 10
save 60 10000

在redis配置文件中可以看到这样三个配置,如果满足其中任何一条,则都会触发RDB的bgsave

除此之外,主从复制,执行shutdown命令,也会自动执行rdb的持久化操作。

save [m] [n]原理

在redis的内部,其实有一个定时器事件,每隔固定时间去检查当前数据发生的变化次数与时间。如果满足上述save配置的相关参数,redis则会开启一个子进程,这个子进程会遍历整个内存来进行存储操作。而主进程则依旧正常提供服务。

具体实现:是通过serverCron函数、dirty计数器、和lastsave时间戳来实现的。

serverCron是redis服务器的周期性函数,默认每100ms执行一次,该函数对服务器的状态进行维护,其中一个任务就是检查save m n配置的条件是否满足,如果满足就执行bgsave。

dirty计数器是redis服务器为此的一个记录,记录上一次执行bgsave/save之后,服务器中的数据被修改了多少次。bgsave/save之后,该计数器会被清零

lastsave是一个时间戳,记录上一次bgsave/save成功的时间。

bgsave流程

1、redis父进程判断当前是否存在正在执行的bgsave/save操作,如果存在,则直接返回

2、如果不存在,这创建一个子进程,子进程默认会与父进程共享相同的数据空间,自进场遍历内存中的数据文件,这样就解决了在生成快照的过程中又有新的写入请求带来数据不一致的问题。父进程创建子进程的过程是阻塞的。

3、子进程创建RDB文件,完成之后自动通知主进程。

4、根据配置的是否进行压缩开关,决定是否压缩生成的RDB文件。

RDB文件

在redis.conf文件中,有几项与RDB文件存放配置有关

一个是dir

## dir属性,配置RDB文件存放的目录文件夹
dir ./

一个是dbfilename

## dbfilename,指定生成的备份文件名
dbfilename dump.rdb

还有一个是rdbcompression

## 采用LZF算法对RDB文件进行压缩,这个算法虽然耗时,但是可以大大减小RDB文件的体积,默认是开启的
rdbcompression yes

RDB文件的载入工作是在服务器启动时自动执行的,并没有专门的命令。但是由于AOF的优先级更高,因此当AOF开启时,Redis会优先载入AOF文件来恢复数据只有当AOF关闭时,才会在Redis服务器启动时检测RDB文件,并自动载入服务器载入RDB文件期间处于阻塞状态,直到载入完成为止。 Redis载入RDB文件时,会对RDB文件进行校验,如果文件损坏,则日志中会打印错误,Redis启动失败。

配置项

RDB持久化机制是默认开启的,只要有save [m] [n]配置的存在,就表示自动开启了RDB的持久化机制。

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

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

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

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

## RDB文件名 
dbfilename dump.rdb

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

关闭RDB的操作有两种

1、客户端关闭RDB 立即生效

## 在客户端中设置save为空,立即生效
config set save ""

2、配置文件中永远关闭,重启后生效

#Save 900 1     
#Save 300 10   
#Save 60 10000  
Save ""

修改完成后,重启Redis服务即可。

小结

简单总结了一下Redis中RDB的操作

参考资料

一篇大牛对redis持久化的总结 其实这篇博客,更像是对这篇大牛博客的一个自我学习总结。

你可能感兴趣的:(分布式)