redis持久化之RDB

Redis的RDB持久化通过快照实现,用于崩溃后恢复数据,防止缓存击穿导致雪崩。触发快照的方式包括自定义规则、save/bgsave命令、flushall命令和主从复制。在创建RDB文件过程中,Redis父进程会阻塞,子进程生成快照并原子替换旧文件。RDB优点是文件小、利于传输,但可能丢失最后一次快照后的数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先明确一点: redis持久化是为了崩溃重启后能把缓存恢复。防止造成缓存击穿 进而引发雪崩。
rdb:是redis默认的存储方式,RDB方式是通过快照( snapshotting )完成的。保存的是内存空间这一刻的数据,不记录命令过程。
触发快照的方式:
1. 符合自定义配置的快照规则
2. 执行save或者bgsave命令
3. 执行flflushall命令
4. 执行主从复制操作 (第一次)

常见配置如下:
           save "" # 不使用RDB存储 不能主从
            save 900 1 # 表示15分钟(900秒钟)内至少1个键被更改则进行快照。
           save 300 10 # 表示5分钟(300秒)内至少10个键被更改则进行快照。
           save 60 10000 # 表示1分钟内至少10000个键被更改则进行快照

RDB执行流程:

在这里插入图片描述

  1. Redis父进程首先判断:当前是否在执行save,或bgsave/bgrewriteaof(aof文件重写命令)的子
    进程,如果在执行则bgsave命令直接返回。
  2. 父进程执行fork(调用OS函数复制主进程)操作创建子进程,这个复制过程中父进程是阻塞的,
    Redis不能执行来自客户端的任何命令。
  3. 父进程fork后,bgsave命令返回”Background saving started”信息并不再阻塞父进程,并可以响
    应其他命令。
  4. 子进程创建RDB文件,根据父进程内存快照生成临时快照文件,完成后对原有文件进行原子替换。
    (RDB始终完整)
  5. 子进程发送信号给父进程表示完成,父进程更新统计信息。
    其实主要就是 先检测是否已经有子进程在执行了,有就返回,没有就调用操作系统的函数复杂主进程,创建子进程,在复制父进程的时候,会阻塞redis,不能执行来自客户端的任何命令。fork子进程之后,就不再阻塞父进程。然后子进程创建rdb文件进行快照。快照之后会对原有文件进行院子替换。rdb文件始终会保证只有一份并且完整。创建完之后,子进程会告诉父进程,活干完了,你可以重新计时了,就是那个触发快照的条件刷新下。

RDB的优缺点
优点
RDB是二进制压缩文件,占用空间小,便于传输(传给slaver)
主进程fork子进程,可以最大化Redis性能,主进程不能太大,Redis的数据量不能太大,复制过程中主
进程阻塞
缺点
不保证数据完整性,会丢失最后一次快照以后更改的所有数据

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值