Redis的RDB和AOF

Redis的RDB和AOF

概述

Redis 提供了两种持久化方式:RDB和AOF

RDB使用一次生成内存快照的方式,产生的文件紧凑压缩比更高,因此读取RDB恢复速度更快,由于每次生成RDB开销较大,无法做到实时持久化,一般用于数据冷备和复制传输

AOF持久化 以独立日志的方式记录每次写命令,重启时在重新执行AOF文件中的命令达到恢复数据的目的。AOF主要作用是解决了数据持久化的实时性,目前已经是Redis持久化的主流方式

RDB

触发机制

  1. 手动触发save命令

    save命令会阻塞当前Redis服务器,直到RDB完成,对于内存较大的实例会造成长时间阻塞不建议线上环境使用

  2. 手动触发bgsave命令

    Redis进程执行fork操作创建子进程,RDB持久化过程由子进程负责,阻塞只发生在fork阶段

  3. 自动触发

    1. 使用save相关配置 “save m n” 表示在m秒内数据集存在n次修改自动触发bgsave
    2. 从节点执行全量复制操作
    3. 执行debug reload命令重新加载Redis时
    4. 默认情况下执行 shutdown 命令,并且没有开启AOF持久化功能时

bgsave触发流程

如图所示

1) 执行bgsave 命令,redis父进程判断当前是否存在正在执行的进程(RDB/AOF) 存在直接返回

2)父进程执行fork操作创建子进程,fork会发生阻塞

3)父进程fork完成后,bgsave命令返回“background saving started”信息并不会阻塞进程,可以继续响应其他命令

4)子线程创建RDB文件,根据父进程内存生成的临时快照文件,完成后对原有文件进行原子替换

5)进程发送信号给父进程表示江湾城,父进程更新统计信息

Redis默认采用LZF算法对成圣的RDB文件做压缩处理,压缩后的文件远远小于内存大小

RDB的优点

  1. RDB是紧凑压缩的二进制文件,代表Redis早某个时间点上的数据快照,非常适合用于备份,全量复制的场景
  2. Redis加载RDB恢复数据远远快于AOF

RDB的缺点

  1. RDB的方式数据没办法做到持久化/秒级持久化。
  2. RDB文件使用特定二进制保存,Redis版本演变过程有多个格式的RDB。存在不兼容问题

AOF

AOF工作流程

​ 如图所示:

​ 1)所有的命令都会追加到aof_buf(缓冲区)中

​ 2)AOF缓冲区根据对赢得策略向硬盘做同步策略

​ 3)随着AOF文件越来越大,定期对AOF进行重写

​ 4) Redis重启时,加载AOF文件进行数据恢复

命令写入

​ AOF命令写入直接用的是文本协议格式,文本协议有较好的兼容性,开启AOF之后所有命令写入直接采用文本协议避免了二次开销,文本协议具有可读性,方便修改和处理

​ Redis把命令追加到缓冲区的好处:Redis使用单线程响应命令,如果吧AOF文件命令直接追加到硬盘,性能完全取决于当前硬盘的负载,Redis可以提供多种缓冲区同步硬盘策略,可以再性能和安全方面做出平衡

文件同步

​ everysec:命令写入aof_buf后调用系统write操作,write完成后线程返回。fsync同步文件操作由专门线程每秒调用一次

  no:命令写入aof_buf后调用系统write操作,不对AOF文件做fsync同步,同步硬盘操作由操作系统负责,通常同步周期最长30s 

​ write操作会触发延迟写(delayed write)机制,Linux在内核提供页缓冲区用来提高硬盘IO性能,write操作在写入系统缓冲区后直接返回,同步硬盘操作依赖于系统调度机制,例如:缓冲区页空间写满或达到特定时间周期。同步文件之前,如果此时系统故障宕机,缓冲区内数据将丢失。

​ fsync针对单个文件操作(比如AOF文件),做强制硬盘同步,fsync将阻塞直到写入硬盘完成后返回,保证了数据持久化。

always:命令写入aof_buf后调用系统fsync操作同步到AOF文件,fsync完成后线程返回

  配置为always时,每次写入都要同步AOF文件,在一般的SATA硬盘上,Redis只能支持大约几百TPS写入,显然跟Redis高性能特性背道而驰,不建议配置。

  配置为no,由于操作系统每次同步AOF文件的周期不可控,而且会加大每次同步硬盘的数据量,虽然提升了性能,但数据安全性无法保证。

  配置为everysec,是建议的同步策略,也是默认配置,做到兼顾性能和数据安全性。理论上只有在系统突然宕机的情况下丢失1秒的数据。

重写机制

  1. 为什么重写之后AOF 的文件可以变小 进程中超时数据不在写入文件,旧的AOF文件含有无效命令,多条写命令可以合并为一个
全部评论

相关推荐

头像
今天 09:40
已编辑
山东大学 嵌入式软件工程师
前两天参加移动的座谈会,HR讲到薪资的时候,提了一嘴:我们这个总包指的是大家以后的年薪现金总包,也就是月薪+年终奖+现金补贴的税前总包,不是公司的用人成本总包,他们电信联通就爱干这事。这时候我就想举两个例子,都是我之前爆料过薪资的:九院九部研发设计类薪资:https://www.nowcoder.com/share/jump/1734051230923中国船舶707所薪资待遇:https://www.nowcoder.com/share/jump/1734051244015这时候就出现了问题:总包到底是啥?总包到底咋算的?央国企的薪资普遍不算高,这一点大家应该都能达成共识。然而,具体的薪资水平...
小型域名服务器:个人理解,通常意义下:总包 = 税前(月薪+年终奖+现金补贴)= 实际到手薪资+扣的税+个人缴纳的五险一金。就像如果互联网企业开的薪资是30 X 15,那么总包就是45,其中月薪3w,年终奖3个月工资9万。所以移动HR说的这个总包是真的总包,只不过因为移动的各种补贴是随着月工资发放的,所以相当于每个月的月薪都不尽相同。部分单位经常用来宣传的,用人成本包 = 税前(月薪+年终奖+现金补贴)+ 单位缴纳的五险一金 + 各种非现金福利。有很多公司会这么宣传的,甚至我之前拿到offer的大多数公司都这么宣传,但是有的HR问他总包构成的话,他会说里面是含有一部分福利的,也有的就一直打马虎眼。总之,因为各种非现金福利、扣税和缴纳五险一金的缘故,导致公司实际支出的成本和我们拿到手的现金之间有不小的差距,不要被骗了
点赞 评论 收藏
分享
11-06 10:58
已编辑
门头沟学院 嵌入式工程师
双非25想找富婆不想打工:哦,这该死的伦敦腔,我敢打赌,你简直是个天才,如果我有offer的话,我一定用offer狠狠的打在你的脸上
点赞 评论 收藏
分享
爱看电影的杨桃allin春招:我感觉你在炫耀
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务