zoukankan      html  css  js  c++  java
  • 《Redis设计与实现》之第十章:RDB持久化

    RDB持久化功能所生成的RDB文件是一个经过压缩的二进制文件,通过该文件可以还原生成RDB文件时的数据库状态。(数据库状态:服务器中的非空数据库以及它们的键值对统称为数据库状态)

    一.RDB文件的创建和载入

    1.save和bgsave命令可以用来生成RDB文件

    save命令会阻塞Redis服务器进程,直到RDB文件创建完毕为止,在服务器进程阻塞期间,服务器不能处理任何命令请求

    bgsave命令会派生出一个子进程,然后子进程负责创建RDB文件,服务器进程(父进程)继续处理命令请求

    2.RDB文件的载入

    RDB文件的载入工作是在服务器启动的时候自动执行的,只要Redis服务器在启动时检测到RDB文件存在,就会自动载入RDB文件(所以Redis并没有专门用于载入RDB文件的命令)。在服务器在载入RDB文件期间,会一直处于阻塞状态,直到载入完成。

    注意:

    因为AOF文件的更新频率通常比RDB文件的更新频率高,所以:

    如果服务器开启了AOF持久化功能,服务器会优先使用AOF文件来还原数据库状态。只有AOF持久化功能处于关闭时,服务器才会使用RDB文件来还原数据库状态。

    2.命令执行时服务器状态

    执行save命令时,客户端发送的所有命令请求都会被阻塞。save命令执行完后,客户端命令才会被处理

    执行bgsave命令时,子进程创建RDB文件,服务器可以正常处理客户端的命令请求。

    注意:执行bgsave命令时,客户端发送的save,bgsave命令会被服务器拒绝,客户端发送的bgrewriteaof命令会被延迟到bgsave命令执行完毕后执行

    二,自动间隔性保存

    1.配置bgsave保存的条件,redis.conf

    save 900 1    服务器在900秒内,对数据库进行了至少一次修改

    save 300 10  服务器在300秒内,对数据库进行了至少10次修改

    save 60 10000  服务器在60秒内,对数据库进行了至少10000次修改

    上面的条件是默认的设置(如果我们不设置 save的值,就按照上面的默认条件)。当服务器启动时,程序会根据save选项设置的保存条件,设置服务器状态redisServer结构的saveparams属性:

    struct redisServer{

      //记录了保存条件的数组

      struct saveparam  *saveparams;

    }

    saveparams属性是一个数组,数组中的每个元素都是一个saveparam结构,每个saveparam结构都保存了一个save选项设置的保存条件:

    struct saveparam{

      //秒数

      time_t seconds;

      //修改数

      int changes;

    }

     那怎么让上面的配置条件生效呢?

    1.redisServer还维持一个dirty计数器和lastsave属性

    dirty计数器记录服务器对数据库状态进行了多少次修改,执行save或bgsave命令后,dirty归零

    lastsave属性是一个时间戳,记录服务器上一次成功执行save或bgsave命令的时间

    2.服务器周期性操作函数serverCron默认每隔100毫秒执行一次,检查save选项设置的保存条件是否满足。

    dirty和changes比较, lastsave-nowtime  和 second比较。只要有一个条件满足,服务器就执行bgsave命令

    三,RDB文件结构

  • 相关阅读:
    「golang」go-micro指定consul地址
    「postgres」无数据则插入,有数据不做插入
    「postgres」导出数据以及分割数据
    「postgre」调整表结构
    「postgre」查看DB的物理占用空间
    「postgre」INT最大值
    「postgre」服务重启
    「golang」关于TIME_WAIT优化
    深入理解Spring Boot属性配置文件
    springboot 中的commandLineRunners接口
  • 原文地址:https://www.cnblogs.com/inspred/p/10665881.html
Copyright © 2011-2022 走看看