Redis系列之Redis持久化机制

Redis持久化防止数据丢失,确保Redis宕机后能恢复数据。RDB通过快照保存内存数据,适合全量恢复,但可能丢失部分数据。AOF记录操作命令,保证数据完整性,但文件体积较大。AOF重写用于减小文件体积,混合持久化结合RDB和AOF优点,提高重启效率。
摘要由CSDN通过智能技术生成

Redis持久化机制

为什么要持久化

如果Redis再次访问时,发现Redis的数据是空的,就会形成缓存穿透。更重要的是,因为Redis的数据是空的,所以客户端想要访问的key都没有,就会造成大量的请求就会瞬间打到数据库上,造成缓存雪崩(少量的key是穿透,大量的key是雪崩)。这个时候,数据库可能就挂掉。而又无法保证redis不宕机,所以需要当redis宕机后,迅速将里里面的内容恢复出来。因此需要做一个持久化。持久化是为了恢复数据用的,而不是存储数据用的

RDB

RDB(Redis DataBase),是Redis默认的存储方式,RDB方式是通过快照(snapshotting)完成的。

触发快照的方式

符合自定义配置的快照规则

  • save 900 1 # 表示15分钟(900秒钟)内至少1个键被更改则进行快照。

  • save 300 10 # 表示5分钟(300秒)内至少10个键被更改则进行快照。

  • save 60 10000 # 表示1分钟内至少10000个键被更改则进行快

N秒内数据集至少有M个改动”这一条件被满足时,自动保存一次数据集。

执行save或者bgsave命令

执行命令save或bgsave可以生成dump.rdb文件,每次命令执行都会将所有redis内存快照到一个新的rdb文件里,并覆盖原有rdb快照文件。

save与bgsave对比:

命令 save bgsave
IO类型 同步 异步
是否阻塞redis其它命令 否(在生成子进程执行调用fork函数时会有短暂阻塞)
复杂度 O(n) O(n)
优点 不会消耗额外内存 不阻塞客户端命令
缺点 阻塞客户端命令 需要fork子进程,消耗内存

配置自动生成rdb文件后台使用的是bgsave方式。

执行flushall命令

flushall
复制代码

清空Redis之前,保存当前Redis快照

执行主从复制操作 (第一次)

第一次主从复制时需要生成rdb文件,会保存当前Redis快照

RDB执行流程

image.png

  • 流程分析

      1. Redis父进程首先判断:当前是否在执行save或bgsave/bgrewriteaof(aof文件重写命令)的子进程,如果在执行则bgsave命令直接返回。
      1. 父进程执行fork(调用操作系统函数复制主进程)操作创建子进程,这个过程中父进程是阻塞的,Redis不能执行来自客户端的任何命令。
      1. 父进程fork后,bgsave命令返回”Background saving started”信息并不再阻塞父进程,并可以响应其他命令。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值