Redis 持久化详解

news2024/11/28 8:43:57

目录

    • 一、简介
    • 二、RDB持久化
      • 2.1、SAVE
      • 2.2、BGSAVE
      • 2.3、SAVE选项
      • 2.4、RDB文件结构
      • 2.5、RDB文件载入
    • 三、AOF持久化
      • 3.1、开启AOF功能
      • 3.2、配置AOF文件的冲洗频率
      • 3.3、AOF重写
        • 3.3.1、BGREWRITEAOF命令(手动)
        • 3.3.2、AOF重写配置选项(自动)
    • 四、RDB-AOF混合持久化
      • 4.1、RDB和AOF的优劣
      • 4.2、开启RDB-AOF混合持久化
      • 4.3、RDB-AOF混合持久化文件载入
    • 结语

一、简介

  本文今天主要是Redis的持久化方式,都是关于RDBAOF,常见的持久方式有:

  • RDB持久化
  • AOF持久化
  • RDB-AOF混合持久化

二、RDB持久化

  RDB持久化是Redis默认使用的持久化功能,该功能可以创建出一个经过压缩的二进制文件,它包含了服务器在各个数据库中存储的键值对数据等信息。RDB持久化产生的文件都以 .rdb 后缀结尾,其中 rdb 代表Redis DataBase(Redis数据库)。Redis提供了多种创建RDB文件的方法,主要是下面三种:

  • SAVE(阻塞服务器并创建RDB文件)
  • BGSAVE(以非阻塞方式创建RDB文件)
  • 通过配置选项自动创建RDB文件

2.1、SAVE

  用户可以通过执行SAVE命令,要求Redis服务器以同步方式创建一个记录了服务器当前所有数据库数据的RDB文件,这里使用的是无参命令。

127.0.0.1:6379> save
OK

  服务器接收到SAVE命令,将遍历所有数据库,并将各个数据库包含的键值对全部记录到RDB文件中。在执行SAVE命令期间,Redis服务器将阻塞,直到RDB文件创建完成为止。如果Redis服务器在执行SAVE命令时已经拥有了相应的RDB文件,那么服务器将使用新创建的RDB文件替换已有的RDB文件,大致流程如下:

在这里插入图片描述

2.2、BGSAVE

  我们知道Redis在执行SAVE命令时,会阻塞整个服务器,无法为其他客户端提供服务,如果数据量很大,阻塞就更严重了,所以为了解决这个问题,Redis提供了SAVE命令的异步版本BGSAVE命令,它们不同之处在于,BGSAVE命令不会使用Redis的服务进程创建RDB文件,而是使用子进程创建RDB文件。

127.0.0.1:6379> bgsave
Background saving started

大致的执行流程是:

  • 创建一个子进程
  • 子进程执行SAVE命令,创建新的RDB文件
  • 当子进程完成新的RDB文件创建之后,会通知Redis服务器进程(新的RDB文件创建完成)
  • Redis服务器使用新的RDB文件替换旧的RDB文件

在这里插入图片描述

2.3、SAVE选项

  其实用户除了使用上述两种手动创建RDB文件的方式之外,还能通过设置SAVE选项,让Redis服务器在满足指定条件时自动执行BGSAVE命令,SAVE命令选项接收 seconds changes 两个参数,语法如下:

save <seconds> <changes>
  • seconds :指定触发持久化操作所需时长
  • changes :指定触发持久化操作所需的修改次数

  简单来说,如果Redis服务器在 seconds 秒之内,它包含的数据库总共执行了至少 changes 次修改,那么Redis服务器就自动执行一次BGSAVE命令,比如:

save 30 1000

  就是Redis服务器在30秒内至少执行了1000次修改,那么就会自动执行BGSAVE命令。实际Redis服务器是支持同时使用多个save选项的,我们可以在配置文件中找到默认的配置:

save 900 1
save 300 10
save 60 10000

当以下任意一个条件被满足是,服务器就会执行一次BGSAVE命令

  • 在900s(15分钟)之内,服务器对数据库执行了至少1次修改
  • 在300s(5分钟)之内,服务器对数据库执行了至少10次修改
  • 在60s(1分钟)之内,服务器对数据库执行了至少10000次修改

2.4、RDB文件结构

  通过下面的图,我们了解下RDB文件结构。

在这里插入图片描述

  • RDB文件表示符 :文件最开头的部分为RDB文件表示符,内容为“REDIS”这5个字符
  • 版本号 :RDB文件表示符之后的4个字符长度的数字
  • 设备附加信息 :记录生成RDB文件的Redis服务器及其所在平台的信息(如服务器版本、创建RDB的时间戳等)
  • 数据库数据 :记录Redis服务器存储的0个或任意多个数据库的数据,一般从0号数据库开始排列
  • Lua脚本缓存 :如果开启了复制功能,服务器将在RDB文件的Lua脚本缓存部分报错所有已被缓存的Lua脚本
  • EOF :标识RDB正文内容的末尾
  • CRC64校验和 :64位整数表示的CRC校验和,用来检查RDB文件是否出错或者损坏

2.5、RDB文件载入

  RDB文件载入的流程图如下:
在这里插入图片描述
  总的来说,无论用户使用哪种方式,如果遇到停机时,服务器丢失的数据量取决于创建RDB文件的时间间隔:间隔越长,停机丢失的数据就越多。所以RDB持久更像是一种备份手段而非一种普通的数据持久化手段,比如离线备份。为了解决可能丢失大量数据这一问题,所以推出了我们即将介绍的AOF持久化模式。

三、AOF持久化

  与RDB这种全量式持久化不同,AOF提供的是增量式持久化功能,核心原理是:服务器每次执行完写命令后,都会以协议文本的方式降被执行的命令追加到AOF文件的末尾。当服务器在停机后,只要重新执行AOF中保存的Redis命令,就可以将数据库恢复到停机之前的状态。

3.1、开启AOF功能

  用户可以通过服务器的appendonly选项来决定是否打开AOF持久化功能

appendonly <value>
  • appendonly yes :开启AOF持久化功能
  • appendonly no :关闭AOF持久化功能

  如果开启了AOF持久化功能,Redis服务器在默认情况下将创建一个名为 appendonly.aof 的文件作为AOF文件

3.2、配置AOF文件的冲洗频率

  当程序通过系统对文件进行写入时,系统并不会直接将数据写入硬盘,而是会将数据写入位于内存的缓冲区中,等到数据达到某些写入条件或者达到某个时限,系统才会将缓冲区的数据刷到硬盘中,从而提高程序的性能,但是也会给程序的写入操作带来不确定性。所以AOF就想用户提供了appendfsync 选项,用来控制系统冲洗AOF文件的频率,语法如下:

appendfsync <value>

appendfsync 的选项有:always、everysec、no 3个值,代表的意义分别如下:

  • always :每执行一个写命令,就对AOF文件执行一次冲洗操作
  • everysec :每隔1s,就对AOF文件执行一次冲洗操作
  • no :不主动对AOF文件进行冲洗操作,由操作系统决定何时对AOF进行冲洗

  Redis使用 everysec 作为 appendfsync 选项的默认值,所以没有明确的需求,尽量不要去修改这个选项的值。

3.3、AOF重写

  随着服务器不断运行,被执行的命令变得越来越多,那么记录这些命令的AOF文件就变成越来越大,假设对同一个键做了很多的修改操作,那么AOF文件中就会出现很多的冗余命令,比如:

127.0.0.1:6379> set fruit apple
OK
127.0.0.1:6379> set fruit orange
OK
127.0.0.1:6379> set fruit banana
OK
127.0.0.1:6379> sadd set v1
(integer) 1
127.0.0.1:6379> sadd set v2
(integer) 1
127.0.0.1:6379> sadd set v3
(integer) 1
127.0.0.1:6379> srem set v3
(integer) 1
127.0.0.1:6379> sadd set v4
(integer) 1

  实际上这些命令对数据库的最终修改效果可以简化为:

set fruit banana
sadd set v1 v2 v4

  这就是我们要提到的Redis提供的AOF重写功能,该功能能够生成一个全新的AOF文件,并且文件中只包含恢复当前数据库所需的尽可能少的命令。

3.3.1、BGREWRITEAOF命令(手动)

  用户可以通过执行BGREWRITEAOF 命令来显示地触发AOF重写,该命令是一个异步命令,Redis服务器接收到该命令之后会创建一个子进程,由它扫描整个数据库并生成新的AOF文件,当新的AOF文件生成完毕,子进程就会退出并通知Redis,然后Redis服务器就会使用新的AOF文件替代原来的AOF文件,完成重写操作。这个过程和我们之前RDB异步持久化差不多。不懂的可以看本文的2.2章节

BGREWRITEAOF
  • 如果发送BGREWRITEAOF 时,服务器在创建RDB文件,那么AOF重写操作会延到RDB文件创建完毕之后
  • 如果发送BGREWRITEAOF 时,已经在做重写操作,那么就会报错,提示AOF重写操作已经在处理了

3.3.2、AOF重写配置选项(自动)

  除了手动执行BGREWRITEAOF 命令创建AOF文件之外,还可以通过设置一下两个配置选项让redis自动触发BGREWRITEAOF 命令。

auto-aof-rewrite-percentage 100    #文件体积增大100%就自动重写
auto-aof-rewrite-min-size 64mb     #文件体积小于64mb不会重写
  • auto-aof-rewrite-min-size:设置触发自动重写AOF文件所需的最小的文件大小
  • auto-aof-rewrite-percentage:设置触发自动重写AOF文件所需要的文件大小增大的比例

四、RDB-AOF混合持久化

4.1、RDB和AOF的优劣

  上面我们介绍了Redis的两种持久化方式

  • RDB持久化,生成的RDB文件比较小,使用RDB文件进行恢复时速度非常快,但是RDB的全量式持久化模式可能会让服务器丢失大量数据
  • AOF持久化,存储的是协议文本,文件会比较大,并且使用AOF文件进行恢复时相对较慢(通过执行AOF文件中的命令),但是AOF持久化丢失的数据可以控制在1秒内

4.2、开启RDB-AOF混合持久化

  从Redis4.0开始引入了RDB-AOF混合持久化模式,这种模式还是基于AOF模式构建的,需要的两个条件是:

  • 开启了AOF持久化功能
  • 设置 aof-use-rdb-preamble yes

  满足这两个条件后,如果Redis在执行AOF重写操作时(上面介绍过),就会像执行BGSAVE命令那样,根据数据库当前的状态生成相应的RDB数据,并且将这个数据写入到新建的AOF文件中,那些在重写之后的命令,则会继续以协议文本的方式追加到AOF文件的末尾,也就是说,我们的服务器生成的AOF文件由两部分组成,最前面是RDB格式的数据,后面则是AOF格式的数据。

4.3、RDB-AOF混合持久化文件载入

  开启了RDB-AOF混合持久化模式的Redis服务器启动并载入AOF文件时,它会检查AOF文件的开头是否包含RDB格式的内容:

  • 如果包含,那么就会先载入开头的RDB数据,然后在载入之后的AOF数据
  • 如果不包含,那么就直接载入AOF数据

大致的流程图如下:

在这里插入图片描述

结语

  从Redis4.0之后我们应该优先使用RDB-AOF混合持久化,如果是Redis4.0之前的版本,RDB更像是数据备份,AOF更接近数据持久化,可以优先使用AOF持久化,并将RDB当做辅助(比如手动)数据备份手段。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/166588.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Android | Service

Android Service Service 概念 实现程序后台运行的解决方案&#xff0c;一种可在后台执行长时间运行操作而不提供界面的应用组件。Service 的运行不依赖于任何用户界面&#xff0c;即使程序被切换到后台&#xff0c;或者用户打开了另外一个应用程序&#xff0c;Service 仍然能…

Vue3——第十五章(计算属性:computed)

一、基础示例 模板中的表达式虽然方便&#xff0c;但也只能用来做简单的操作。如果在模板中写太多逻辑&#xff0c;会让模板变得臃肿&#xff0c;难以维护。推荐使用计算属性来描述依赖响应式状态的复杂逻辑。 在这里定义了一个计算属性 publishedBooksMessage。computed() 方…

【设计模式】创建型模式·原型模式

设计模式学习之旅(五) 查看更多可关注后查看主页设计模式DayToDay专栏 一. 概述 用一个已经创建的实例作为原型&#xff0c;通过复制(克隆)该原型对象来创建一个和原型对象相同的新对象。 原型模式包含如下角色&#xff1a; 抽象原型类&#xff1a;规定了具体原型对象必须实现…

Java基础(二)

1.标识符标识符&#xff1a;由数字、字符、下划线、$组成&#xff08;不能以数字、下划线开头&#xff09;java严格区分大小写2.命名规范包名&#xff1a;多单词组成时所有字母全部小写类名、接口名&#xff1a;多单词组成时&#xff0c;所有单词首字母大写变量名、方法名&…

屏幕录制工具哪个好用?分享3款相见恨晚的软件

在我们的日常生活中&#xff0c;我们经常使用截图和手机屏幕记录功能来记录一些重要的内容。然而&#xff0c;录制的图片清晰度很低&#xff0c;或者需要不断的截图&#xff0c;这很容易出错一些重要的内容&#xff0c;这个时候就需要进行录屏了。那么电脑上的屏幕录制工具哪个…

group by详解

group by功能 在SQL中group by主要用来进行分组统计&#xff0c;分组字段放在group by的后面&#xff1b;分组结果一般需要借助聚合函数实现。 group by语法结构 1、常用语法 语法结构 SELECT column_name1,column_name2, … 聚合函数1,聚合函数2 , … FROM table_name GROUP…

电脑删除了大文件怎么恢复?看看这四种方法

电脑能够帮助我们存储大量的文件&#xff0c;比如视频、文档、音频等&#xff0c;但是随着时间的流逝&#xff0c;有些文件所存在的意义也变得毫无价值了&#xff0c;这时候很多小伙伴都会选择删除操作&#xff0c;可是由于电脑磁盘内容过多&#xff0c;容易面临重要文件被误删…

硬件仿真加速器与原型验证平台

基于软件仿真工具对于动辄几百万门的ASIC验证而言&#xff0c;几乎显得力不从心。不管是从成本还是从性能的角度来看&#xff0c;使用硬件仿真器或者基于FPGA的原型验证平台&#xff0c;几乎是验证工程师的不二法门。因为基于硬件的环境能够极大的提高验证的速度&#xff0c;增…

Promise(基础)

Promise是什么 1.promise是一门新的技术&#xff08;ES6规范&#xff09; 2.Promise是JS中一编程的解决方案&#xff08;旧的解决方案是单纯的使用回调函数&#xff09; 3.promise一个构造函数&#xff0c;promise队形用来封装一个一步操作并可以获取其成功/失败的结果值。 注…

sparksql案例实操

sparksql案例实操解决语句如下 select * from( select , rank()over(partition by area order by clickCnt desc) from(select area, product_name, count()as clickCnt from( select a.*, p.product_name, c.area, c.city_name from user_visit_action a join product_info p…

Dubbo与Spring集成

Dubbo框架常被当作第三方框架集成到应用中&#xff0c;当Spring集成Dubbo框架后&#xff0c;为什么在编写代码的时候&#xff0c;只用了DubboReference注解就可以调用提供方的服务了呢&#xff1f;这篇笔记就是分析Dubbo框架是怎么与Spring结合的。 现状integration层代码编写…

关于嵌入式学习和规划,求指点?

在知乎上收到的一个提问问题&#xff1a;各位大佬好&#xff0c;我先说说基本情况&#xff0c;28岁&#xff0c;北京&#xff0c;嵌入式软开&#xff0c;军工行业。硕士毕业一年半。工作不忙收获很少&#xff0c;造成我自己特别迷茫&#xff0c;没有了方向&#xff0c;自己学没…

【C++】Hash闭散列

目录 一、哈希的概念 1.1 哈希冲突 1.2 哈希函数 1.3 装载因子 二、闭散列 2.1 线性探测 2.2 Insert 插入 2.3 Find 查找 2.4 Erase删除 2.5 插入复杂类型 2.6 二次探测 三、源代码与测试用例 3.1 hash源代码 3.2 测试用例 一、哈希的概念 在前面学习了二叉搜索…

多巴胺聚乙二醇多巴胺,Dopamine-PEG-Dopamine简介,多巴胺是具有正性肌力活动的单胺化合物

产品名称&#xff1a;多巴胺聚乙二醇多巴胺&#xff0c;双多巴胺聚乙二醇&#xff08;Dopamine-PEG-Dopamine&#xff09; 中文别名&#xff1a;多巴胺PEG多巴胺&#xff0c;双多巴胺聚乙二醇 英文名称&#xff1a;Dopamine-PEG-Dopamine 存储条件&#xff1a;-20C&#xff0…

磨金石教育影视技能干货分享|浅析中国CG特效的发展现状

中国CG特效的发展2015年是一个分水岭。在2015年之前&#xff0c;中国CG 特效发展是混乱的&#xff0c;不成熟的。总体表现就是技术水平不足&#xff0c;缺少人才培养的体系。当时从事CG的公司&#xff0c;大概有两个类型&#xff1a;“技术型与业务型”。所谓技术型的公司&…

设计模式_结构型模式 -《装饰器模式》

设计模式_结构型模式 -《装饰器模式》 笔记整理自 黑马程序员Java设计模式详解&#xff0c; 23种Java设计模式&#xff08;图解框架源码分析实战&#xff09; 概述 我们先来看一个快餐店的例子。 快餐店有炒面、炒饭这些快餐&#xff0c;可以额外附加鸡蛋、火腿、培根这些配菜…

PowerDesigner设计表时显示注释列Comment

首先&#xff0c;使用 PowerDesigner 新建模型&#xff0c;File —> New Model 然后&#xff0c;切换到模型类型(Model types)选项卡&#xff0c;选中 Physical Diagram 然后点击右侧表格图标&#xff0c;在左侧面板中创建表格如下。双击表格&#xff0c;找到Columns选项卡…

招标采购中,如何编写有效的RFI(信息邀请书)?

在企业招标采购过程中&#xff0c;RFI&#xff08;信息邀请书&#xff09;是一个从商品或服务的潜在供应商处收集信息的正式流程。RFI旨在由客户编写并发送给潜在供应商。RFI通常是第一个也是最广泛的一系列请求&#xff0c;旨在缩小潜在供应商候选人名单。 当企业对潜在供应…

【实际开发07】- XxxxController 批量处理 × 5 -【model】

目录 1. Mode 1. IotTypeController 基础 7 tips 2. 辅助添加 Validated 无法覆盖的 参数校验 1. 预处理空指针异常 ( 校验 : 核心必填参数 not null ) 3. RequestBody 对应API 存在 feign 调用时 , 注意 : 不可缺省 1. feign API 需要加 RequestBody , Controller 层可…

手工测试 | 黑盒测试方法论—边界值

本文节选自霍格沃兹测试学院内部教材 边界值分析法是一种很实用的黑盒测试用例方法&#xff0c;它具有很强的发现故障的能力。边界值分析法也是作为对等价类划分法的补充&#xff0c;测试用例来自等价类的边界。 这个方法其实是在测试实践当中发现&#xff0c;Bug 往往出现在定…