明天咱们来聊一聊Redis长久化的形式RDB。

咱们晓得Redis绝对于传统的缓存技术最大的特点之一就是反对数据的长久化。Redis会定期对内存数据快照写入磁盘,当内存数据失落(如服务重启、宕机导致)时,能够加载磁盘中的数据疾速复原到内存。

RDB即Redis Database,其长久化形式是将内存数据以二进制的形式存储到磁盘上,防止服务器意外宕机时依然能够从磁盘找回数据。存储的文件默认为dump.rdb。

RDB长久化操作过程

  • Redis fork一个子过程
  • 子过程领有主过程的内存数据正本,子过程将内存正本数据写入长期的rdb文件中
  • 子过程写入实现后,用新的rdb文件替换掉原有的rdb文件,同时删除旧的文件

其实子过程被fork进去后,会同时拷贝一份主过程的内存援用,而非残缺的内存正本集。这就利用了操作的零碎的写时复制性能,只有在父过程的内存产生批改时才会实在的复制一份内存给子过程应用,而且复制是以页为单位进行的。这样就大大减少了内存的应用空间,晋升了效率。
整个长久化过程中只有fork过程会发送阻塞,子过程rdb文件的存储过程是异步的。

RDB是如何触发的
Redis提供命令来手动触发rdb操作:save和bgsave。两者的区别是save是同步操作,执行过程中会阻塞Redis对外服务。尤其在大数据量的save时,会导致服务较长时间的服务中断。而bgsave则是fork一个子过程来异步解决长久化,长久化的过程齐全不影响Redis服务,生产上也是罕用。

Redis提供了参数来配置RDB的主动触发,定义 m秒内n次键值产生改变。例如

save 900 1save 300 10save 60 10000

60秒内呈现10000次键值变更
300秒内呈现10次键值扭转
900秒内1次键值扭转
示意当满足上述三种状况的任一种时,都将触发一次bgsave操作。

另外有一点补充阐明一下,在执行save或bgsave操作时,如果发现零碎有正在执行的save操作,而且未超过2秒

主动存储的实现细节
redisServer保护了主动触发的配置信息,同时保护了一个dirty计数器和上次执行完save的工夫。

struct redisServer {    // 主动保留的配置信息    struct saveparam *saveparams;         long dirty;//批改计数器    time_t lastsave;//上一次执行save的工夫    // ...};struct saveparam {    time_t seconds;//秒数    int changes;//批改次数};
  • dirty计数器 redis每执行一次写入操作时,dirty值+1,
  • lastsave 记录最近一次胜利执行完save/bgsave操作的工夫(Unix工夫戳)

serverCron是redis中的周期执行函数,默认100ms执行一次(可通过redis.config批改执行频率),其中一个查看就是查看是否满足了RDB主动执行条件。对于单个 save m n来说,只有当同时满足以下两个条件时,才会触发一次长久化

now - lastsave > mdirty >= n

这里的n次变更是指服务端的变更,而不是执行客户端申请的写入命令操作数。即,当执行一条 sadd myset a b c, dirty的值会减少3。

RDB相干的配置

  • save m n m秒内产生n次变更则执行一次bgsave。呈现save配置后,redis会启用rdb长久化
  • dir /usr/local/redis-5.0.7/data 快照文件门路
  • dbfilename dump.rdb 快照文件名,默认为dump.rdb。生产环境个别会退出端口信息,命名为:dupm.6379.rdb
  • stop-writes-on-bgsave-error yes 当bgsave执行出现异常时,是否进行接管客户端的写入申请。
  • rdbcompression yes 启用rdb文件压缩。启用压缩后会节俭磁盘空间,但减少CPU的耗费资源
  • rdbchecksum yes 启用rdb文件一致性校验

应用RDB复原数据

  1. 获取快照文件目录。能够应用 config get dir 获取快照目录
  2. 进行redis服务。 执行shudown命令
  3. 将快照文件dump.rdb拷贝到config get dir输入的目录下
  4. 重新启动redis服务
    值得阐明的一点是当应用rdb文件启动加载内存数据时,会造成服务的阻塞,直到齐全加载实现能力对外提供服务。因而在服务启动时罕用aof形式来复原内存数据。

RDB长久化形式的优劣

  • rdb文件保留的十分紧凑的二进制文件,占用的磁盘空间小,内存复原速度快
  • 便于数据快照的备份,能够依据须要定时备份rdb文件即可

毛病

  • RDB长久化是有肯定频率的,而且不适宜高频率长久化,这样当意外停机时,可能呈现较长时间段内的数据失落
  • 长久化时尽管子过程能够异步进行,但每次都是全量数据的IO刷盘,造成IO负载减轻,当数据量很大时可能呈现IO瓶颈
  • fork过程也会造成阻塞,而且fork的工夫和内存的大小无关,过大的内存fork时导致较长时间的阻塞