美文网首页编程语言爱好者
Redis学习笔记(八) RDB持久化

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

作者: 86961a452866 | 来源:发表于2020-05-17 11:11 被阅读0次

    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命令自动间隔保存。

    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文件结构 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、哈希表对象

    5、有序结合对象

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

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

    相关文章

      网友评论

        本文标题:Redis学习笔记(八) RDB持久化

        本文链接:https://www.haomeiwen.com/subject/jfyjohtx.html