• Redis学习笔记(八) RDB持久化


    Redis是内存数据库,它将自己的数据库状态存储在内存里面,所以如果不想办法将存储在内存中的数据库状态保存到磁盘,那么服务器 进程一旦退出,服务器中的数据库状态也会消失不见。

    为了解决这个问题,Redis提供了RDB持久化功能,这个功能可以将数据库状态保存到磁盘里面

    1、RDB文件的创建与载入

    Redis可以使用SAVE或BGSAVE命令创建RDB文件。

    SAVE命令会阻塞服务器进程,直到RDB文件创建完毕,在服务器阻塞过程中服务器不能处理任何命令,所以此时客户端发送来的命令都会被拒绝。

    BGSAVE命令会派生一个子线程,然后由子线程负责创建RDB文件,服务器进程(主进程)继续处理命令。

    RDB文件的载入是在服务器启动时自动执行,所以Redis并没有专门载入RDB文件的命令,只要Redis服务器在启动时检测到RDB文件存在,它就会自动载入。

    由于AOF文件的更新频率通常比RDB文件更新频率高,所以如果服务器开启了AOF,那么服务器优先从AOF文件还原数据库,只有AOF关闭时,服务器才会使用RDB文件还原数据库。

    BGSAVE命令执行时,Redis服务器处理SAVE、BGSAVE、BGREWRITEAOF命令方式会与平时不同。

    1、SAVE命令会被服务器拒绝,服务器禁止SAVE、BGSAVE命令同时执行,是为了避免主线程与子线程同时执行rdbSave产生竞争条件。

    2、BGSAVE命令同样也会被拒绝,因为两个BGSAVE命令也会产生竞争条件。

    3、BGREWRITEAOF命令会被延迟到BGSAVE命令执行完毕后执行,如果 BGREWRITEAOF命令正在执行,那么客户端发送的BGSAVE命令会被服务器拒绝。

    RDB文件载入时,服务器会处在阻塞状态,直到载入工作完成。

    Redis使用BGSAVE命令自动间隔保存。

    1、RDB文件的创建与载入
    Redis可以使用SAVE或BGSAVE命令创建RDB文件。
    SAVE命令会阻塞服务器进程,直到RDB文件创建完毕,在服务器阻塞过程中服务器不能处理任何命令,所以此时客户端发送来的命令都会被拒绝。
    BGSAVE命令会派生一个子线程,然后由子线程负责创建RDB文件,服务器进程(主进程)继续处理命令。
    RDB文件的载入实在服务器启动时自动执行,所以Redis并没有专门载入RDB文件的命令,只要Redis服务器在启动时检测到RDB文件存在,它就会自动载入。
    由于AOF文件的跟新频率通常比RDB文件更新频率高,所以如果服务器开启了AOF,那么服务器优先从AOF文件还原数据库,只有AOF关闭时,服务器才会使用RDB文件还原数据库。
    BGSAVE命令执行时,Redis服务器处理SAVE、BGSAVE、BGREWRITEAOF命令方式会与平时不同。
    1、SAVE命令会被服务器拒绝,服务器禁止SAVE、BGSAVE命令同时执行,是为了避免主线程与子线程同时执行rdbSave产生竞争条件。
    2、BGSAVE命令同样也会被拒绝,因为两个BGSAVE命令也会产生竞争条件。
    3、BGREWRITEAOF命令会被延迟到BGSAVE命令执行完毕后执行,如果 BGREWRITEAOF命令正在执行,那么客户端发送的BGSAVE命令会被服务器拒绝。
    RDB文件载入时,服务器会处在阻塞状态,直到载入工作完成。
    Redis使用BGSAVE命令自动间隔保存。

    struct redisServer{
    //记录了保存条件的数组
    struct saveparam *saveparams;
    //修改计数器
    long long diry;
    //上一次执行保存的时间
    time_t lastsave;
    }
    save选项的保存条件:
    struct saveparam{
    //秒数
    time_t seconds;
    //修改次数
    int changes;
    }

    Redis的服务器周期性操作函数serverCron默认100毫秒执行一次,用于维护正在运行的服务器,他的一项工作就是检查save选项所设置的保存条件是否已经满足,如果满足则执行BGSAVE命令。

     

    RDB文件结构

     

     RDB文件中的数据库结构示例

    Redis 标识时Redis数据库RDB文件
    db_version 文件版本
    selectdb 标识后面是查询的第几个数据库。
    pairt 保存着该数据库的所有键值对以及过期时间
    EOF 标识内容结束
    check_sum 校验和,用来检测RDB文件是否正确有无损坏。


    VALUE编码:
    1、字符串对象
    redis支持压缩存储,如果不压缩的情况下,存储len与字符串;如果压缩则结构如下:

     REDIS_RDB_ENC_LZF常量标志着字符串被LZF算法压缩,读入陈旭在碰到这个常量时会根据compressed_len(压缩后长度),orgin_len(原长度)和compressed_string (压缩后字符串)三个部分,对字符串进行解压缩。

    2、列表对象

     list_length记录了列表长度。tiem每一项都是一个字符串,程序读入时按字符串对象读入。

    3、集合对象 存储方式与列表对象相似。

    4、哈希表对象

     其中key_value_pair结构中的键值对以键紧挨值的方式排列。

    5、有序结合对象

     


    每天学一点,总会有收获。

     

    说明:尊重作者知识产权,文中内容参考《Redis设计与实现》,仅在此做学习与大家分享。

     




  • 相关阅读:
    redis学习(四)
    redis学习(三)
    redis学习(二)
    redis学习(一)
    Maven入门(二)pom.xml和核心概念
    Maven入门(一)
    uni-app 引用
    uni-app 搜索栏
    Vue,组件切换-切换动画
    Vue,组件切换-方式2
  • 原文地址:https://www.cnblogs.com/xtt321/p/12903996.html
Copyright © 2020-2023  润新知