Redis内部运作机制---数据落地之RDB模式

     Redis将数据保存在内存中,为了保证数据的持久化,在遇到服务器重启等内存数据丢失情况下保证Redis的正常运行,Redis提供两种数据持久化模式——RDB和AOF。
     RDB模式的核心思想是 在服务器正常运行的情况下,RDB程序将内存中的数据以快照的形式保存到磁盘文件中,在redis重启时,RDB程序通过载入RDB文件还原数据库状态。

     


     RDB模式的核心功能就是rdbSave和rdbLoad函数
     
     rdbSave函数负责将内存中的数据库数据以RDB格式保存到磁盘中,如果RDB文件已经存在,那么新的RDB文件会将旧的文件替换掉。

     rdbSave函数在执行过程中会阻塞主进程,一直到数据完整保存到磁盘中为止。

     rdbSave函数在RDB模式中存在于两套机制,即SAVE和BGSAVE,两个命令都会调用rdbSave函数
SAVE命令直接调用rdbSave函数,会阻塞主进程,导致服务端此时无法响应客户端的所有请求
BGSAVE命令会fock一个子进程,子进程会用于调用rdbSave函数,并在完全保存后想主进程发送信号,通知操作已经完成。所以这种机制不会造成主进程阻塞,服务端在此过程中可以响应客户端的所有请求。

     由于SAVE命令在执行构成中会阻塞主进程,所以此时调用SAVE命令、BGSAVE命令、AOF存储是不会产生任何作用的,只有在SAVE命定结束后,Redis服务器可以重新相应客户端的请求后,新的SAVE命令、BGSAVE命令、BGREWRITEAOF命令才会生效。而AOF写入是基于后台线程的,BGREWRITEAOF命令由子进程完成的,所以在SAVE命令执行的过程中,此时AOF写入和BGREWRITEAOF命令可以同时执行。注意同时执行不等于SAVE在执行过程中,主进程相应新的AOF写入。

     BGSAVE是由子进程完成的,如果BGSAVE命令在调用过程中,此时调用SAVE命令或BGSAVE命令,服务端会检测到BGSAVE命令正在执行,返回给客户端错误信息。这样避免同时调用rdbSave函数,造成竞争条件。BGSAVE命令和BGREWRITEAOF命令虽然都是子进程完成的,但是也不允许同时执行,因为两个子进程同时进行磁盘写入,性能会很低。如果BGSAVE在执行,BGREWRITEAOF会被延迟到BGSAVE命令执行结束后执行,客户端会收到延迟执行的信息。如果BGREWRITEAOF正在执行,此时调用BGSAVE会报错。



     —————————————————————


     rdbLoad函数的主要功能是读取RDB文件然后还原Redis数据库的数据

     rdbLoad函数在恢复内存数据的过程中,服务端可以响应客户端的发布与订阅功能请求,但是任何与数据库相关的操作请求都不会执行.



     —————————————————————
     
     RDB文件的文件结构

     

     文件开始保存REDIS五个字符用于标示此文件是否是RDB文件

     RDB-VERSION是当前RDB文件四位版本号,不同版本的RDB文件互不兼容

     DB-DATA保存着每个数据库的数据,SELECT-DB是跟在后面的键值对所属的数据库号码,KEY-VALUE-PAIRS保存着数据库中的数据键值对

     EOF字段为单个数据库内容结尾,并非RDB文件结尾

     CHECK-SUM字段为文件所有内容校验值


     






  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值