Redis持久化详解

RDB持久化

Redis是基于内存的数据库,如果退出进程,数据将会消失,所以我们可以把内存中的数据持久化到磁盘上,下次开启Redis进程的时候,读取磁盘中的数据到内存中,就可以继续正常使用Redis了

RDB持久化是Redis服务器把数据库当前的状态,压缩成一个二进制的RDB文件保存到磁盘.

数据库状态–>RDB文件 RDB文件–>(恢复)数据库状态

因为RDB文件是保存在硬盘上的,就算Redis服务器停止或者宕机,计算机停机,只要RDB文件存在,Redis服务器就可以用它来还原数据库的状态.

RDB文件的创建和载入

Redis有两个命令可以生成RDB文件,

  1. SAVE
  2. BGSAVE

他们的区别是:

SAVE命令会阻塞Redis服务器,直到RDB文件生成之后才能处理其他命令请求

BGSAVE命令会在后台fork出一个子进程,然后子进程用于生成RDB文件,Redis服务器仍然可以处理命令请求

BGSAVE采用轮询等待的方式 等待子进程的信号(生成RDB结束)

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

因为AOF的更新频率比RDB文件高

如果服务器开启了AOF功能,Redis服务器启动的时候就不会载入RDB文件,优先使用AOF文件还原数据库

只有在AOF功能处于关闭状态时,才会默认载入RDB文件

在BGSAVE命令的执行过程中,处理SAVE,BGSAVE,BGREWRITEAOF命令的方式也不同

在Redis服务器执行BGSAVE的过程中,因为SAVE和BGSAVE, BGSAVE和BGSAVE都存在竞争关系,所以Redis服务器会拒绝SAVE和BGSAVE的请求

其次BGSAVE和BGREWRITEAOF命令不能同时执行 如果当前是BGSAVE状态, BGREWRITEAOF将会等到BGSAVE执行后在执行

如果当前是BGREWRITEAOF状态,服务器将会拒绝BGSAVE命令

服务器在载入RDB文件的过程中 会一直处于阻塞状态,知道RDB文件载入完成

自动间隔性保存

Redis允许用户通过配置save选项,让服务器每隔一段时间自动运行BGSAVE命令

save配置文件

save 900 1

save 300 10

save 60 10000

当只要满足三个条件之一,服务器就会执行BGSAVE命令

  • 900秒内至少1次修改
  • 300秒内至少10次修改
  • 60秒内至少10000次修改

服务器会根据save选项设置RedisServer结构的saveparams参数

image-20220402162652699

除了saveparams参数外 服务器还维护了一个dirty计数器和一个lastsave属性

dirty用于记录上次(成功)执行BGSAVE/SAVE命令后数据库的修改次数

lastsave用于记录上次(成功)执行BGSAVE/SAVE命令后的Unix时间戳

image-20220402163314629

假设图10-8位当前服务器的状态,在经过了301秒之后(1378271101)服务器会执行一次BGSAVE,因为在300秒内数据库发生了至少10次修改.

image-20220402163610235

假设BGSAVE命令5秒后执行完成,现在数据库的状态是 dirty计数器被重新置为0, 当前lastsave时间戳被更新为1378271106(1378271101+5)

RDB文件结构

Redis(5字节)db_version(4字节)data_basesEOF(1字节)check_num(8字节)

文件头部的Redis部分为5个字节保存着"Redis" 这五个字符,通过这5个字符可以快速的检查当前文件是否是RDB文件

db_version长度为4字节,记录的是RDB的默认版本号 例"0006"

data_bases包含0个或任意个redis数据库

EOF为1字节,当读到EOF时标志着RDB文件正文内容的结束

check_num是8字节的无符号整数,保存的是一个校验和,check_num的数值是由REDIS,db_version,data_bases,EOF四个部分计算出来的, 作用是可以校验RDB文件是否损坏或错误.

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Redis持久化是为了避免进程退出导致数据的永久丢失而设计的。由于Redis是基于内存的数据库,数据存储在内存中,关闭服务或者断电会导致数据丢失。为了解决这个问题,Redis提供了两种持久化方式:AOF(Append Only File)和RDB(Redis Database File)。 AOF持久化是通过将写操作追加到AOF文件中来实现的。AOF文件是一个只追加的日志文件,记录了写操作的命令。当Redis重启时,Redis会根据AOF文件中的命令重新执行一遍,从而恢复数据。AOF文件的大小会随着写操作的增加而增大,因此可能会占用较大的磁盘空间。为了避免AOF文件过大,Redis提供了AOF重写机制,可以定期地将AOF文件重写为紧凑格式,只保留可以恢复数据库状态的最小命令集合。 RDB持久化是通过将当前数据库状态快照保存到一个二进制文件中来实现的。RDB文件是一个经过压缩的二进制文件,包含了数据库的数据和键值对的过期时间等信息。RDB持久化是通过fork子进程来实现的,它会将当前数据库状态保存到一个临时文件中,然后替换原来的RDB文件。RDB持久化适用于数据备份和灾难恢复。 除了持久化之外,Redis还支持快照机制。快照是将当前数据库状态保存到一个RDB文件中,可以手动触发或者通过配置选项定期触发。快照只保存了数据库的最新状态,而不是增量的写操作。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值