Redis持久化(1)

都知道mysql事务有四个比较核心的特性:原子性,一致性,持久性,隔离性。

其中持久性的意思就是持久化,mysql之所以可以持久化是因为mysql的数据存储在硬盘上。重启进程或者主机之后,数据仍然存在。

但redis的数据则是存储在内存上,在内存上存储数据是不持久的,但Redis为什么可以持久化呢?

Redis相比于mysql这种关系型数据库,最大的优点就是快/效率高!

为了保证速度快,数据肯定还得在内存中,但为了持久,数据还得想办法存储在硬盘上。

Redis实现持久化,是用什么策略来实现的呢?

RDB和AOF

首先在redis中查找数据的时候,是直接从内存读取的,硬盘中数据的作用就是在redis重启或者其他原因导致内存中数据丢失的时候,用来恢复内存中数据的,简单来说,硬盘中的数据相当于备份

 RDB就是定期备份:每段时间,把内存中的数据整体备份到硬盘上。

AOF就是实时备份:只要更新内存,就是立即把这个数据备份到硬盘上。

RDB实现过程

RDB定期的把我们Redis中的所有数,都写入到硬盘当中,生成一个“快照”

通俗来说,就是redis给内存当前存储的数据,赶紧拍个照片,生成一个文件,存储在硬盘中,后面redis一旦重启(内存中数据就没了),就可以根据刚刚的“快照”把内存中的数据恢复。

定期具体来说有两种方式:手动触发,自动触发。

手动触发

我们可以通过redis客户端,执行特定的命令,来触发快照生成。

save:执行save的时候,redis会全力的进行快照生成,此时就会阻塞redis其他客户端的命令,因为redis是单线程执行~所以就会导致keys*的后果。(不建议使用)

bgsave:bg就是background的意思,不会影响redis处理其他客户端的命令或者请求~~

但redis并不是偷偷开个多线程,此处就是并发编程的场景,redis使用的是”多进程“的方式来完成bgsave的实现。

自动触发

可以在redis的配置文件中,设置一下让redis每个多长时间。每产生多少次修改就触发。

下面是bgsave命令的流程图

redis生成的rdb文件,是存放在redis的工作目录中的,也是在redis配置文件中进行设置的 

rdb机制生成的镜像文件是二进制文件,当执行生成rdb镜像操作的时候,此时就会把要生成的快照数据先保存到一个临时文件中~ 当这个快照快生成完毕之后,在删除之前的rdb文件,把新生成的rdb文件名改为dump.rdb~~(rdb文件只有一个)

RDB特点总结

  • RDB是一个紧凑压缩的二进制文件,代表redis在某个时间点上的数据快照,非常适用于备份,全量复制场景。
  • redis加载RDB恢复数据远远快于AOF的方式
  • RDB方式数据没办法做到实时持久化(两次快照生成之间,实时的数据可能会随着重启丢失),秒级持久化,因为bgsave每次运行都要执行fork创建子进程,属于重量级操作,频繁执行成本过高
  • RDB文件使用特定的二进制格式保存,redis版本演进过程有多个RDB版本,兼容性可能有风险。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值