Redis的数据持久化方案

news2025/2/26 22:51:10

目录

前言

RDB方式

概述:

1.RDB手动

2.RDB自动

  RDB优缺点

AOF方式 

概述

AOF写数据的三种策略

AOF相关配置

AOF重写

AOF重写方式

手动重写  bgrewriteaof

自动重写

总结


前言

Redis是一个内存型数据库,也就是说如果不将内存中的数据保存到磁盘,那么服务器进程一旦退出,服务器中的数据也会随之消失,因此redis提供了两种方式供我们进行数据持久化操作。

  • RDB方式:该方式关注数据本身,它将当前数据进行保存,类似于快照,用于存储数据结果,存储格式简单
  • AOF方式:该方式关注数据的操作过程,它将数据的操作过程以日志的形式进行保存,实现数据持久化

RDB方式

概述:

在指定的时间间隔内,将内存中的数据集快照写入磁盘,恢复时将快照文件直接读到内存中

RDB快照有两种方式,即手动和自动,下文依次介绍

1.RDB手动

save指令

命令 :save

作用 :手动执行一次保存操作

save指令相关配置

dbfilename dump.rdb

说明:设置本地数据库文件名,默认值为 dump.rdb

经验:通常设置为 dump-端口号.rdb

dir

说明:设置存储.rdb文件的路径

经验:通常设置成存储空间较大的目录中,目录名称data rdbcompression yes

rdbcompression yes

说明:设置存储至本地数据库时是否压缩数据,默认为 yes,采用 LZF算法 压缩

经验:通常默认为开启状态,如果设置为no,可以节省 CPU 运行时间,但会使存储的文件变大(巨 大)

rdbchecksum yes

说明:设置是否进行CRC64算法RDB文件格式校验, 该校验过程在写文件和读文件过程均进行

经验:通常默认为开启状态,如果设置为no,可以节约读写性过程约10%时间消耗,但是存储一定的数 据损坏风险

save指令工作原理(单线程任务执行序列)

客户端1 127.0.0.1:6379>set key1 value1

客户端2 127.0.0.1:6379>set key2 value2

客户端3 127.0.0.1:6379>save

客户端4 127.0.0.1:6379>get key

对redis数据库执行4此指令顺序===> set set save get

注意:save指令的执行会阻塞当前Redis服务器,直到当前RDB过程完成为止,有可能会造成长时间阻 塞,线上环境不建议使用

bgsave指令

命令 :bgsave

作用 :手动启动后台保存操作,但不是立即执行

bgsave指令工作原理

 

注意: bgsave命令是针对save阻塞问题做的优化。Redis内部所有涉及到RDB操作都采用bgsave的方 式,save命令可以放弃使用。

Fork

Fork的作用是复制一个与当前进程一样的进程。新进程的所有数据(变量、环境变量、程序计数器等) 数值都和原进程一致,但是是一个全新的进程,并作为原进程的子进程 

2.RDB自动

配置 :save second changes

作用 : 满足限定时间范围内key的变化数量达到指定数量即进行持久化

参数 :

        second:监控时间范围

        changes:监控key的变化量

位置 : 在conf文件中进行配置

注意:

  • save配置要根据实际业务情况进行设置,频度过高或过低都会出现性能问题,结果可能是灾难性的
  • save配置中对于second与changes设置通常具有互补对应关系,尽量不要设置成包含性关系
  • save配置启动后执行的是bgsave操作

  RDB优缺点

  • RDB是一个紧凑压缩的二进制文件,存储效率较高
  • RDB内部存储的是redis在某个时间点的数据快照,非常适合用于数据备份,全量复制等场景
  • RDB恢复数据的速度要比AOF快很多 RDB节省磁盘空间
  • Fork的时候,内存中的数据被克隆了一份,大致2倍的膨胀性需要考虑 虽然Redis在fork时使用了写时拷贝技术,但是如果数据庞大时还是比较消耗性能
  • RDB方式无论是执行指令还是利用配置,无法做到实时持久化,具有较大的可能性丢失数据
  • Redis的众多版本中未进行RDB文件格式的版本统一,有可能出现各版本服务之间数据格式无法兼容现象

AOF方式 

概述

AOF(append only file)持久化:以独立日志的方式记录每次写命令,重启时再重新执行AOF文件中命令 达到恢复数据的目的;与RDB相比可以简单描述为改记录数据为记录数据产生的过程AOF的主要作用是 解决了数据持久化的实时性,目前已经是Redis持久化的主流方式

AOF写数据的三种策略

always(每次)

每次写入操作均同步到AOF文件中,数据零误差,性能较低

everysec(每秒)

每秒将缓冲区中的指令同步到AOF文件中,数据准确性较高,性能较高 在系统突然宕机的情况下丢失1秒内的数据

no(系统控制)

由操作系统控制每次同步到AOF文件的周期,整体过程不可控

AOF相关配置

配置 :appendonly yes|no

作用 :是否开启AOF持久化功能,默认为不开启状态

配置 :appendfsync always|everysec|no

作用 :AOF写数据策略

配置:appendfilename filename

作用:AOF持久化文件名,默认文件名未appendonly.aof,建议配置为appendonly-端口号.aof

配置:dir

作用 :AOF持久化文件保存路径,与RDB持久化文件保持一致即可

AOF重写

随着命令不断写入AOF,文件会越来越大,为了解决这个问题,Redis引入了AOF重写机制压缩文件体 积。AOF文件重写是将Redis进程内的数据转化为写命令同步到新AOF文件的过程。简单说就是将对同 一个数据的若干个条命令执行结果转化成最终结果数据对应的指令进行记录

AOF重写作用

  • 降低磁盘占用量,提高磁盘利用率
  • 提高持久化效率,降低持久化写时间,提高IO性能
  • 降低数据恢复用时,提高数据恢复效率

AOF重写规则

  • 进程内已超时的数据不再写入文件
  • 忽略无效指令,重写时使用进程内数据直接生成,这样新的AOF文件只保留最终数据的写入命令 如del key1、 hdel key2、srem key3、set key4 111、set key4 222等
  • 对同一数据的多条写命令合并为一条命令
  • 如lpush list1 a、lpush list1 b、 lpush list1 c 可以转化为:lpush list1 a b c。
  • 为防止数据量过大造成客户端缓冲区溢出,对list、set、hash、zset等类型,每条指令最多写入64个元素
  • AOF和RDB同时开启,系统默认取AOF的数据(数据不会存在丢失)

AOF重写方式

手动重写  bgrewriteaof

自动重写

触发机制

        Redis会记录上次重写时的AOF大小,默认配置是当AOF文件大小是上次rewrite后大小的一倍且文 件大于64M时触发;重写虽然可以节约大量磁盘空间,减少恢复时间。

何时重写

        每次重写操作对cpu来说都是有负担的,因此设定Redis要满足一定条件才会进行重写= auto-aof-rewrite-min-size 设置重写的基准值,最小文件64MB。达到这个值开始重写。 auto-aof-rewrite-percentage 设置重写的基准值,文件达到100%时开始重写(文件是原 来 重写后文件的2倍时触发) 

总结

对于Redis的数据持久化就介绍完啦,在使用过程中,官方推荐两个都启用,不过如果对数据不敏感,可以选单独用RDB,不建议单独用 AOF,因为可能会出现 Bug。而如果只是做纯内存缓存,也可以都不用。

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

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

相关文章

overleaf 参考文献引用,创建引用目录.bib文件,在文档中引用参考文献,生成参考文献列表

目录 1 创建一个Overleaf项目 2 导入或创建 .bib 文件 2.1 导入 .bib 文件: 参考文献的 .bib文件获取步骤 (1)打开谷歌学术 (2)输入文献题目 (3)点击引用,然后选择BibTex格式…

af-table-column插件的使用 element el-table-column宽度自适应

af-table-column 是一个用于 Vue.js 的表格列组件,用于在表格中定义列的样式和行为。下面是 af-table-column 的使用方法: 首先,确保已经安装了 af-table-column 包。可以使用以下命令进行安装: npm install af-table-column --…

MySQL——事务

一、事务的开始与结束 一个数据库事务由一条或多条sql语句构成,它们形成一个逻辑的工作单元。这些sql语句要么全部执行成功,要么全部执行失败。 1.1.事物的开始 1.对于DDL(create,alter,drop)和DCL&…

render函数使用和详解

背景 在平时编程时,大部分是通过template来创建html。但是在一些特殊的情况下,使用template方式时,就无法很好的满足需求,在这个时候就需要 通过JavaScript 的编程能力来进行操作。此时,就到了render函数展示拳脚去时…

【Python】迭代器__iter__、__next__

这里主要纠正迭代器的用法,因为一些教程传播错误示例让我很无语。 最大的错误就是,把__iter__和__next写在同个类里,每每看见都感到诧异。不是说这方法不行,主要是,一旦出现预期之外的运行结果往往很难查到原因(因为它…

Nomad 系列-Nomad+Traefik+Tailscale 集成实现零信任安全

系列文章 Nomad 系列文章Traefik 系列文章Tailscale 系列文章 概述 终于到了令人启动的环节了:NomadTraefikTailscale 集成实现零信任安全。 在这里: Nomad 负责容器调度;(容器编排工具)Traefik 负责入口流量&…

文件导入之Validation校验List对象数组

背景: 我们的接口是一个List对象,对象里面的数据基本都有一些基础数据校验的注解,我们怎么样才能校验这些基础规则呢? 我们在导入excel文件进行数据录入的时候,数据录入也有基础的校验规则,这个时候我们又…

Linux下C语言使用 netlink sockets与内核模块通信

netlink简介 Netlink套接字是用以实现用户进程与内核进程通信的一种特殊的进程间通信(IPC) ,也是网络应用程序与内核通信的最常用的接口。在Linux标准内核中,系统默认集成了很多netlink实例,比如日志上报、路由系统等,netlink消息是双向的&a…

解决 tesserocr报错 Failed to init API, possibly an invalid tessdata path : ./

问题描述 我们在初次使用tesserocr库的时候,可能会报以下错误: RuntimeError: Failed to init API, possibly an invalid tessdata path: ./ 这是因为我们在使用 conda 创建的环境中找不到"tessdata"这个文件夹。 解决办法 这时候把Tessera…

【CMake工具】工具CMake编译轻度使用(C/C++)

目录 CMake编译工具 一、CMake概述 二、CMake的使用 2.1 注释 2.1.1 注释行 2.1.2 注释块 2.2 源文件 2.1.1 共处一室 2.1.2 VIP包房 2.3 私人定制 2.2.1 定义变量 2.2.2 指定使用的C标准 2.2.3 指定输出的路径 2.4 搜索文件 2.3.1 方式1 2.3.2 方式2 2.5 包含…

CRM软件系统能否监控手机的使用

CRM可以监控手机吗?答案是不可以。CRM是一款帮助企业优化业务流程,提高销售效率的工具。例如Zoho CRM,最多也就是听一下销售的通话录音,却不可以监控手机,毕竟CRM不是一款监控软件。 CRM的主要作用有以下几点&#xf…

CASAIM与南京航空航天大学在自动化叶片曲面分析系统开展合作,推动航空航天发动机零部件自动化3D检测进程

近期,CASAIM与南京航空航天大学在自动化叶片曲面分析系统展开深入合作,充分发挥双方在航空航天和智能检测领域优势,共同推动航空航天发动机零部件自动化3D检测进程。 南京航空航天大学创建于1952年10月,是新中国自己创办的第一批…

聚观早报|华为Mate 60 Pro支持面容支付;特斯拉重回底特律车展

【聚观365】9月8日消息 华为Mate 60 Pro已支持面容支付 特斯拉将重回底特律车展 iPhone在美国有1.67亿用户 韩国半导体8月份出口85.6亿美元 比亚迪元PLUS冠军版将于9月15日上市 华为Mate 60 Pro已支持面容支付 毫无预热的华为Mate 60 Pro突然在华为商城首批开售&#xf…

Ansys Zemax | 手机镜头设计 - 第 3 部分:使用 STAR 模块和 ZOS-API 进行 STOP 分析

本文是 3 篇系列文章的一部分,该系列文章将讨论智能手机镜头模组设计的挑战,从概念、设计到制造和结构变形的分析。本文是三部分系列的第三部分。它涵盖了使用 Ansys Zemax OpticStudio Enterprise 版本提供的 STAR 技术对智能手机镜头进行自动的结构、热…

微信小程序的开发---tabBar的介绍

目录 一、tabBar的介绍 二、tabBar的6个组成部分 三、tabBar节点的配置项 四、tab项的配置选项 五、tabBar的使用 一、tabBar的介绍 tabBar是移动端应用常见的页面效果,用于实现多页面的快速切换。小程序中通常将其分为: (1)…

猫头虎解析:如何巧妙避免GET请求中的“EOF“错误?

🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁 🦄 博客首页——🐅🐾猫头虎的博客🎐 🐳 《面试题大全专栏》 🦕 文章图文…

企业架构LNMP学习笔记22

防盗链原理和实现。 域名A的资源文件,经常被域名B直接调用访问。 而用户经常访问域名B,看到的资源(图片等)以为是域名B的,实际则是域名A的。 但是域名A没有获得任何收益,却要给域名B来源的访问消耗服务器…

解决eclipse的报错:Must declare a named package because this compilation

刚安装完成eclipse, 创建类的时候报错 报错信息如下: 原因:新版本的ECLIPSE要求每一个类都必须定义在包里面 解决方法:创建类的时候指定类的名字,如下图:Package 里面填写ch3,表示包名 创建完成…

智慧物联网医疗,树立可持续性智能化和便利化新标杆

医疗物联网(IoMT)是一个快速发展的领域,它正在改变医疗保健的未来。IoMT 指的是物理设备、车辆、家用电器和其他嵌入传感器、软件和网络连接的对象的网络。这些设备可以帮助医疗保健提供者更好地了解患者的状况,并提供更高效和更有…

区分何时使用内连接或者外连接

一张表(A)中的一条记录可以对应另一张表(B)中的多条记录; 另一张表(B)中的一条记录只能对应一张表(A)中的一条记录。 //查询所有姓张的学生的id,name和所在班级name 这里如果外键可以为空的话就需要使用左外连接,才可以查到。 内连接 //假如外键不可以为空select…