redis的持久化

  • rdb持久化

  rdb文件的创建

  rdb文件的创建有手动创建和按照redis配置自动执行的两种方式。

  1.手动创建RDB文件的方式

  用save或者bgsave命令可以将当前的各个数据库中的键值对生成RDB文件格式的文件。其中,save命令是阻断式的,在运行save命令的时候redis服务器不再接受任何其他的对数据库操作的请求。而bgsave会新创建一个子进程,在子进程中进行生成RDB文件的操作,从而redis服务器可以处理其他的数据库操作请求,但是这些请求不会被写入到RDB文件。

  2.自动创建RDB文件的方式

  可以通过配置redis配置文件,然后在程序运行过程中监测的方式来创建并且写入RDB文件

  

   上述配置表示如果在60秒内进行了至少10000次数据库的修改,或者在300秒之内进行了10次修改,或者在900秒内至少进行了1次修改,则立即以bgsave的方式将数据写入RDB文件。

   实现:每100毫秒将检查一次从上次写入RDB文件开始时到当前时间对数据库进行修改的次数,当时间达到配置文件中的60,300,900的时候将检查修改的次数如果大于10000,10,1时则写入RDB文件,再次写入文件都会覆盖原来的文件。

  rdb文件的载入

  rdb文件的载入是在服务启动的时候自动检测rdb文件进行的,没有专门的载入命令。

  rdb文件结构

  

   redis:5个字节,表示这是一个RDB文件。

  db_version:4个字节,表示RDB文件的版本。

  databases:存放数据库的键值对。

  EOF:标志着文件内容结束。

  check_sum:前面四个部分的校验和,用来检测RDB文件是否损坏。

  databases部分又分:

  

   expiretime_ms:常量,长度为1字节,它告诉程序接下来的数字是键值对的过期时间。

  ms:键值对的过期时间

  type:键值对中键的类型。为以下几种:

  


  • aof持久化

  aof持久化需要在数据库中将默认的appendonly no的no改为yes。在redis启动的时候就会自动生成aof文件。

  aof文件的追加

  redis会将修改数据库状态的语句追加到缓冲区(redis的缓冲区,其实就是一个字符串数组)

  aof文件的写入和同步

  文件的写入指的是将redis缓冲区中的数据添加到内存缓存区(操作系统层面),而同步是指将内存缓冲区中的数据添加到磁盘文件。

  文件写入和同步的时机:在每个事件结束后。

  如何写入和同步:根据下表的配置不同(默认是everysec),写入和同步行为不同。

  

   aof文件的载入与还原

  aof文件中包含了重建数据库状态的所有写命令,所以服务器只要读入并重新执行一遍所有的写命令就能将服务器还原成关闭之前的状态。

  aof文件的重写

  由于服务器关闭之前的数据库写入命令可能非常的多,这样会导致aof文件过大对服务器造成影响。

  aof文件的重写可以解决这一问题。做法是将目前数据库的状态以命令的形式写入并同步到aof文件。可以通过bgrewriteaof命令手动的去执行重写,系统也会自动检测,同时满足以下条件将会执行重写操作:

  1》aof文件的大小大于redis.conf中配置的auto-aof-rewrite-min-size参数值

  2》aof文件的大小和上一次重写后aof文件的大小的比值要大于等于redis.conf配置中的auto-aof-rewrite-percentage参数值

  目前的redis并没有提供阻塞用户命令的重写方式,都是fork一个子进程,在子进程中进行重写,这样将会导致在重写时间内用户的写入命令不会被追加到aof文件,如果这个时候断电,将丢失这段时间内的用户的写入数据,于是redis维护一个重写的内存缓冲区,这样的话,在重写时间内用户的写入命令会分别写到原来的AOF缓冲区和重写缓冲区。既不影响aof文件的正常写入,又可以在后台重写操作完成后将重写缓冲区中的写入命令追加到重写生成的aof文件,最后只需要将重写生成的aof文件替换掉主进程写入的aof文件就可以完成aof的重写操作。

原文地址:https://www.cnblogs.com/ll9507/p/11449373.html