Redis随笔(三)-RDB持久化

一、redis持久化

什么是持久化,简单来讲就是将数据放到断电后数据不会丢失的设备中。也就是我们通常理解的硬盘上。

因为redis是内存数据库,它将自己的数据库状态储存到内存里面,如果不想办法将内存里面的数据库状态保存到磁盘里面,那么一旦服务器进程退出,服务器中数据库状态也会丢(ps:redis是一个键值对数据库服务器,服务器中通常包含任意个非空数据库,服务器中非空数据库以及他们的键值对就是数据库状态)。

为了解决这个问题
redis提出RDB 持久化和 AOF 持久化方式。

二、RDB快照

RDB快照:Redis支持将当前数据的快照存成一个数据文件的持久化机制。

Redis借助了fork命令的copy on write机制。在生成快照时,将当前进程fork出一个子进程,然后在子进程中循环所有的数据,将数据写成为RDB文件。

生成方式:
命令生成:redis可以通过SAVE或BGSAVE命令生成rdb文件
自动生成:可以在redis.conf中配置使它自动生成

注:Redis在生成RDB文件时,不能进行AOF重写。
Redis随笔(三)-RDB持久化

1、SAVE命令

SAVE命令执行时,redis服务器会被阻塞,此时客户端所有的命令都会被拒绝,只有当服务器执行完SAVE命令、重新开始接受命令请求后,客户端发送的命令才会被处理。
客户端执行SAVE命令如下图所示:
Redis随笔(三)-RDB持久化

2、BGSAVE命令

BGSAVE命令保存工作是由子进程执行的,所以在子进程创建rdb文件的过程中,redis服务器仍然可以处理客户端请求。
客户端执行BGSAVE命令如下图所示:
Redis随笔(三)-RDB持久化

3、RDB文件

dump.rdb 是二进制文件,可以用od -c ./dump.rdb命令查看其中内容。
Redis随笔(三)-RDB持久化
Redis随笔(三)-RDB持久化

一个rdb文件没有包含任何数据库状态时,由以下四部分组成:

  1. 5个字节的’REDIS’字符串
  2. 四个字节的版本号(db_version):0008
  3. 一个字节的EOF常量:372
  4. 八个字节的校验和

三、自动生成

在redis.conf中有以下配置:
Redis随笔(三)-RDB持久化
可以通过save选项设置多个多个保存条件,只要其中一个满足,服务器就会执行bgsave命令。
表示在m秒内,至少进行n次修改。
在redis服务中的状态如下:
Redis随笔(三)-RDB持久化

  1. dirty:dirty计数器记录上次执行SAVE或者BGSAVE命令后,服务器对数据库状态执行多少次写操作,执行一次写操作后,dirty计数器加1,但是如果执行同时添加多个值(例:sadd a b c),dirty添加3。
  2. lastsave:lastsave属性是一个Unix时间戳,记录上一次执行SAVE或者BGSAVE的时间
  3. redis服务器会周期性操作函数serverCron,默认100毫秒执行一次,该函数对正在运行的服务器进行维护,他的其中一项工作就是检查save选项所设置保存条件是否已经满足,遍历数组,如果满足就执行BGSAVE命令,dirty计数器归0,更新lastsave时间戳。