深入理解Redis—RDB持久化

Redis是一个键值对数据库服务器;

服务器的非空数据库以及其中的键值对统称为“数据库状态”;

Redis是内存数据库,为防止进程退出数据消失,必须将数据库状态持久化到磁盘文件中;

      Redis提供RDB持久化功能,可将内存中的数据库状态保存到磁盘中;

      RDB持久化既可以手动执行,也可以根据配置服务器的配置选项定期执行,该功能可以将某个时间点上的数据库状态保存到一个RDB文件中;

      RDB持久化功能生成的RDB文件一个经过压缩的二进制文件,服务器在启动时通过加载RDB文件还原数据库状态;

RDB文件的创建与载入

      SAVE命令、BGSAVE命令都可用于生成RDB文件;

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

      BGSAVE命令会派生出一个子进程,由子进程在后台负责创建RDB文件,服务器进程继续处理命令请求;

      创建RDB文件的实际工作是底层的rdb.c/rdbSAVE函数,两个命令会以不同的方式调用该函数;(大致流程:①SAVE命令直接调用该函数进行RDB文件的生成;②BGSAVE命令,则先fork一个子进程,通过子进程调用该函数创建RDB文件,结束后向服务器进程发送信号,服务器进程阻塞处理该信号)

      RDB文件的载入工作是在Redis服务器启动时自动执行的,没有专门的命令(服务器在启动时检测到RDB文件时,便自动将其载入)

      注:AOF文件的更新频率通常比RDB文件的更新频率高,所以若服务器同时开启了AOF持久化功能,那么服务器会优先使用AOF文件来还原数据库状态;只有在AOF持久化处于关闭状态时,服务器才会使用RDB文件来还原数据库状态;

SAVE命令执行时的服务器状态

      执行SAVE命令的进程将会被阻塞从而无法处理任何命令请求;

BGSAVE命令执行时的服务器状态

      BGSAVE命令执行期间,服务器处理SAVE、BGSAVE、BGREWRITAOF三个命令的方式会与平时不同;

  • BGSAVE命令执行期间,客户端发送的SAVE命令会被服务器拒绝(服务器进制SAVE命令和BGSAVE命令同时执行是为了避免父进程和子进程同时执行两个rdbSave的调用,防止产生竞争条件)
  • BGSAVE命令执行期间,客户端发送的BGSAVE命令会被服务器拒绝,同时执行两个BGSAVE命令也会产生竞争条件;
  • BGREWRITEAOF和BGSAVE两个命令不能同时执行:
    1. 若BGSAVE命令正在执行,则客户端发送的BGREWRITEAOF命令会被延迟到BGSAVE命令执行完毕之后再执行;
    2. 若BGREWRITEAOF命令正在执行,则客户端发送的BGSAVE命令会被服务器拒绝

BGSAVE与BGREWRITEAOF命令实际工作虽然都由子进程执行,但并无冲突,不同是执行只是出于性能方面的考虑;

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值