美文网首页redis系列
redis系列(三):RDB持久化

redis系列(三):RDB持久化

作者: 范柏柏 | 来源:发表于2020-05-30 15:35 被阅读0次

    redis是内存数据库,他将自己的数据库状态存储在内存里面,异常退出数据就丢了,所以一定要持久化。这一节主要讲RDB持久化。

    首先RDB就是一个文件。他记录了某一个时间点,redis所有数据的快照。

    可以手动生成RDB文件,也可以让服务器定期生成RDB文件。

    手动生成RDB文件

    两个命令:

    • SAVE
    • BGSAVE

    如果想尝试,直接在命令行敲这两个单词就可以了。

    区别:

    1. SAVE是阻塞的,在生成RDB文件的时候,redis阻塞一切指令,相当于停止服务,知道RDB文件生成结束。
    2. BGSAVE是不阻塞的,执行BGSAVE的时候,会在主进程基础上fork一个子进程,当RDB文件生成结束后,通知主进程。注意:fork操作会在创建子进程期间阻塞主进程。

    持久化存储,redis不可能让用户手动执行吧。两个命令只是给用户留的口,redis内部肯定有自动执行的策略。

    自动保存RDB文件

    可以通过配置文件来配置

    // 900秒内,对数据库进行了至少1次修改
    save 900 1   
    // 300秒内,对数据库进行了至少10次修改
    save 300 10
    // 60秒内,对数据库进行了至少1万次修改
    save 60 10000
    

    默认是这三个配置。

    通过计数器,秒数,时间戳,循环判断这三个条件,满足其一,就执行一次RDB文件的创建。

    当然了,还有两种必然会触发RDB持久化的场景

    1. 执行debug reload命令重新加载redis时,会触发save操作
    2. 执行shutdown命令时,如果没有开启AOF持久化,则自动执行BGAVE。

    RDB文件是全量数据的快照。不是增量的。

    redis通过RDB文件恢复数据

    没有专门用来载入RDB文件的命令。只有在redis服务器启动的时候,检测到有RDB文件,就会自动执行RDB的载入。

    但是redis会优先载入AOF文件。如果redis开启了AOF持久化,那直接执行载入AOF文件,RDB文件就废弃了。当redis没有开启AOF持久化功能的时候,服务器才会载入RDB文件。

    RDB文件的结构

    大写为常量,固定值。小写为变量。


    RDB文件结构.png
    • REDIS
      就是字符串REDIS。一个固定值,表示开始。
    • db_version
      RDB文件的版本号。
    • databases
      数据库的所有库(0-15号)的所有key/value快照
    • EOF
      就是字符串EOF。一个固定值,表示结束。
    • check_sum
      校验和。是一个8字节的无符号整数。

    databases部分

    每个数据库的0-15号数据库,都是一个databases


    0-15号数据库存储结构.png 每个号的数据库的存储结构.png key_value_pairs.png

    TYPE是常量字符串,就是底层数据结构的type。
    比如列表类型就是:REDIS_RDB_TYPE_LIST。

    key就是数据库的key。
    value根据类型,存储值。hash类型就是key/value挨着存。

    先是0号数据库,0号数据库的所有key/value一个挨一个存好了。再1号数据库,1号数据库的所有key/value一个挨一个存好了。直到数据库存完了,后面紧挨着一个EOF + 校验和。

    RDB 的优势和劣势

    优势

    1. RDB文件紧凑,全量备份,非常适合用于进行备份和灾难恢复。

    2. 生成RDB文件的时候,redis主进程会fork()一个子进程来处理所有保存工作,主进程不需要进行任何磁盘IO操作。

    3. RDB 在恢复大数据集时的速度比 AOF 的恢复速度要快。

    劣势

    RDB快照是一次全量备份,存储的是内存数据的二进制序列化形式,存储上非常紧凑。当进行快照持久化时,会开启一个子进程专门负责快照持久化,子进程会拥有父进程的内存数据,父进程修改内存子进程不会反应出来,所以在快照持久化期间修改的数据不会被保存,可能丢失数据

    相关文章

      网友评论

        本文标题:redis系列(三):RDB持久化

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