Redis 持久化-AOF

news2024/9/20 18:28:54

Redis 持久化-AOF

1.官方资料

在线文档 : https://redis.io/topics/persistence

2.AOF 是什么?

1、AOF(Append Only File)
2、以日志的形式来记录每个写操作(增量保存),将 Redis 执行过的所有写指令记录下来(比
如 set/del 操作会记录, 读操作 get 不记录)
3、只许追加文件但不可以改写文件
4、redis 启动之初会读取该文件重新构建数据
5、redis 重启的话就根据日志文件的内容将写指令从前到后执行一次以完成数据的恢复工

3.AOF 持久化流程

1、持久化流程示意图

image-20230124122242089

2、解读上图

  1. 客户端的请求写命令会被 append 追加到 AOF 缓冲区内
  2. AOF 缓冲区根据 AOF 持久化策略[always,everysec,no]将操作 sync 同步到磁盘的 AOF 文件
  3. AOF 文件大小超过重写策略或手动重写时,会对 AOF 文件 rewrite 重写,压缩 AOF 文件容
  4. Redis 服务重启时,会重新 load 加载 AOF 文件中的写操作达到数据恢复的目的

4.AOF 开启

1、在 redis.conf 中配置文件名称,默认为 appendonly.aof

image-20230124122333607

2、AOF 文件的保存路径,同 RDB 的路径一致。
3、AOF 和 RDB 同时开启,系统默认取 AOF 的数据
4、当开启 AOF 后, Redis 从 AOF 文件取数据.

image-20230124213158781

image-20230124213424254

5.AOF 实例演示

1、需求:开启 AOF 机制, 使用 AOF 机制进行 Redis 内存数据的备份和恢复

  • 确保 Redis 开启了 AOF 机制

image-20230124213628907

image-20230124213734264

image-20230124213830622

查看aof文件

image-20230124214057875

6.AOF 启动/修复/恢复

1.基本说明

AOF 的备份机制和性能虽然和 RDB 不同, 但是备份和恢复的操作同 RDB 一样, 都是拷贝备
份文件, 需要恢复时再拷贝到 Redis 工作目录下,启动系统即加载

2.正常恢复

1、修改默认的 appendonly no,改为 yes
2、将有数据的 aof 文件定时备份, 需要恢复时, 复制一份保存到对应目录(查看目录:config
get dir)
3、恢复:重启 redis 然后重新加载
4、和前面 RDB 备份/恢复机制类似

3.异常恢复

1、如遇到 AOF 文件损坏,通过/usr/local/bin/redis-check-aof --fix appendonly.aof 进行恢复
2、建议先: 备份被写坏的 AOF 文件
3、恢复:重启 redis,然后重新加载

image-20230124214358207

image-20230124214435967

image-20230124214551305

image-20230124214708879

修复文件

[root@localhost ~]# redis-check-aof --fix appendonly.aof 
0x              7c: Expected prefix '*', got: 'h'
AOF analyzed: size=140, ok_up_to=124, ok_up_to_line=32, diff=16
This will shrink the AOF from 140 bytes, with 16 bytes, to 124 bytes
Continue? [y/N]: y
Successfully truncated AOF
[root@localhost ~]# 

image-20230124215005298

7.同步频率设置

1、配置位置,redis.conf文件中

image-20230124215132256

2、解读上图

appendfsync always

(谨慎使用):每条 Redis 操作命令都会写入磁盘,最多丢失一条数据

appendfsync everysec

(默认):每秒钟写入一次磁盘,最多丢失一秒的数据

appendfsync no

redis 不主动进行同步,把同步时机交给操作系统

(不推荐):由操作系统决定何时写入磁盘,Linux 默认 30s 写入一次数据至磁盘

参考:https://baijiahao.baidu.com/s?id=1740774723808931509&wfr=spider&for=pc

8.Rewrite 压缩

  • rewrite 重写介绍
  1. AOF 文件越来越大,需要定期对 AOF 文件进行重写达到压缩
  2. 旧的 AOF 文件含有无效命令会被忽略,保留最新的数据命令 , 比如 set a a1 ; set a b1 ;
    set a c1; 保留最后一条指令就可以了
  3. 多条写命令可以合并为一个 , 比如 set a c1 b b1 c c1
  4. AOF 重写降低了文件占用空间
  5. 更小的 AOF 文件可以更快的被 redis 加载
  • 重写触发配置
  1. 手动触发
    直接调用 bgrewriteaof 命令

image-20230124215800763

  1. 自动触发

    image-20230124215815701

auto-aof-rewrite-min-size: AOF 文件最小重写大小, 只有当 AOF 文件大小大于该值时候才能
重写, 默认配置 64MB
auto-aof-rewrite-percentage: 当前 AOF 文件大小和最后一次重写后的大小之间的比率等于
或者大于指定的增长百分比,如 100 代表当前 AOF 文件是上次重写的两倍时候才重写
系统载入时或者上次重写完毕时,Redis 会记录此时 AOF 大小,设为base_size,

如果 Redis 的 AOF 当前大小>= base_size +base_size*100% (默认)且当前
大小>=64mb(默认)的情况下,Redis 会对 AOF 进行重写

这里是两个条件:

1.刚开启aof时,aof的文件大小为0即base_size=0,此时要出发重写当aof的文件大小>=64mb即可

2.正常执行的情况依次类推,第二次重写就是128mb

3.假设在执行的过程中aof的文件等于100mb,我们将redis停掉或者说服务器宕机了,再次启动

这时base_size为100mb,那么第二次重写就必须大于等于200mb

9.AOF 持久化小结

1.优势

1、备份机制更稳健,丢失数据概率更低。
2、可读的日志文本,通过操作 AOF 稳健,可以处理误操作

image-20230124220646181

2.劣势

1、比起 RDB 占用更多的磁盘空间
2、恢复备份速度要慢
3、每次读写都同步的话,有一定的性能压力

10.RDB和AOF持久化选择哪一个

1、官方文档地址: https://redis.io/topics/persistence

image-20230124220802468

2、官方推荐两个都启用
3、如果只做缓存:如果你只希望你的数据在服务器运行的时候存在, 你也可以不使用任何
持久化方式

当同时开启aof和rdb两个持久化方式时,默认读取数据是从aof中获取,但aof并不会影响到rdb的备份机制

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

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

相关文章

【大数据趋势】1月24日 美元关键位置上,应该不会一次破,纳指有概率反弹,人民币结汇行情结束在即。

确定市场形态 - 美元指数 关键位置大概率不会一次就破,有较强反弹 作为长期的关键位置101-103这个区域,没有可能一次性涨破,或者一次性跌破,所以大概率有一次反弹出现。作为趋势线(红色)来看&#xff0c…

十大经典排序算法(动态演示+代码)-冒泡算法

时间、空间复杂度比较 排序算法平均时间复杂度最差时间复杂度空间复杂度数据对象稳定性冒泡排序O(n2)O(n2)O(1)稳定选择排序O(n2)O(n2)O(1)数组不稳定、链表稳定插入排序O(n2)O(n2)O(1)稳定快速排序O(n*log2n)O(n2)O(log2n)不稳定堆排序O(n*log2n)O(n*log2n)O(1)不稳定归并排序…

万能四码(0126版本)之分析

万能四码(0126版本)之分析一、万能四码的重新排列原版是这样的:0126,0134,0159,0178,0239,0247,0258,0357,0368,0456,0489…

【进阶C语言】程序环境与预处理

文章目录一.程序环境1.翻译环境编译器1.预处理2.编译3.汇编链接器2.运行环境总图解二.预处理1.预定义符号2.define1.define的定义2.替换规则3.定义的建议和使用的缺点1.加括号2.避免使用带有副作用的符号3.命名约定4.#和##1.#2.##5.宏和函数的对比6.undef3.条件编译1.常量表达式…

趣味三角——第3章——6个三角函数的成熟过程

目录 3.1 6个三角函数的演化进程简述 3.2 Johann Muller(别名Regiomontanus)的贡献 第3章 6个三角函数的成熟过程 It is quite difficult to describe with certainty the beginning of trigonometry . . . . In general, one may say that the emphasis was placed first …

ThinkPHP5 Request类method任意方法调用RCE

ThinkPHP v5.0.x 影响版本&#xff1a;5.0.0 < version < 5.0.23 漏洞点&#xff1a;\think\Request::method 修复&#xff1a;版本更新 top-think/framework4a4b5e6 改进Request类 环境 thinkphp5.0.23核心版&#xff08;需开启debug&#xff09;thinkphp5.0.22完…

设计模式 - 六大设计原则之LoD(迪米特法则原则)

文章目录概述Case学生类老师类Bad ImplBetter Impl老师类改造调用方&#xff1a;校长类改造概述 迪米特法&#xff08;Law Of Demeter &#xff0c; LoD&#xff09;则又叫最少知道原则&#xff08;Least Knowledge Principle&#xff09;&#xff0c;最早是在1987年由美国Nor…

【游戏客户端】如何实现环形进度条

【游戏客户端】如何实现环形进度条 Hello大家好&#xff0c;我是Lampard。好久没写博客了&#xff0c;之前在忙着制作项目的一个大的副本&#xff0c;趁着过年得闲&#xff0c;和大家分享一下制作过程中遇到的一些有趣的问题。今天主要是分享如何在cocos制作一个环形的进度条 (…

重写 equals 时为什么一定要重写 hashCode

equals 方法和 hashCode 方法是 Object 类中的两个基础方法&#xff0c;它们共同协作来判断两个对象是否相等。为什么要这样设计嘞&#xff1f;原因就出在“性能” 2 字上。 使用过 HashMap 我们就知道&#xff0c;通过 hash 计算之后&#xff0c;我们就可以直接定位出某个值存…

移动web 空间转换 3D

移动web 空间转换 3D空间转换 3D3D位移透视3D旋rotateXrotateY左手法则立体呈现空间转换 3D 3D坐标系 3D 坐标系比2D 多了一个Z轴。 一定要记住3个坐标轴取值的正反&#xff1a; X 轴 往右越大&#xff0c;是正值&#xff0c; 否则反之Y 轴 往下越大&#xff0c;是正值&…

React错误边界

首先 我们先构建出问题的场景 我们创建一个react项目 然后在src下创建 components 文件夹目录 在下面创建一个 error.jsx 组件 参开代码如下 import React from "react";export default class App extends React.Component{constructor(props){super(props);this.…

CUDA编程笔记(5)

文章目录前言CUDA的内存组织全局内存常量内存纹理内存和表面内存寄存器局部内存共享内存L1和L2缓存SM的构成API函数查询设备总结前言 cuda的内存组织&#xff0c;在使用GPU时尽可能提高性能&#xff0c;合理的使用设备的内存也是十分重要的。 CUDA的内存组织 如表所示&#…

Docker基本操作

Docker基本操作一、镜像操作1.镜像名称2.镜像命令&#xff08;1&#xff09;拉取、查看镜像&#xff08;2&#xff09;保存、导入镜像二、容器操作1.容器相关命令2.创建并运行一个容器3.进入容器&#xff0c;修改文件4.小结三、数据卷&#xff08;容器数据管理&#xff09;1.什…

Java:枚举类型

Java&#xff1a;枚举类型 每博一文案 师父说&#xff1a;人活一世&#xff0c;每个人都有他的特别&#xff0c;每个人都值得被温柔相待。红尘一遭&#xff0c;每段经历都有它的必然&#xff0c; 每段经历都造就了现在的你&#xff0c;最快乐的事情&#xff0c;就是做自己&…

Java多线程案例之定时器

一. 定时器概述 1. 什么是定时器 定时器是一种实际开发中非常常用的组件, 类似于一个 “闹钟”, 达到一个设定的时间之后, 就执行某个指定好的代码. 比如网络通信中, 如果对方 500ms 内没有返回数据, 则断开连接尝试重连.比如一个 Map, 希望里面的某个 key 在 3s 之后过期(自…

排序算法: 数据的离散化(排序+去重 C++例题实现)

文章目录数据的离散化例题&#xff1a;电影完整代码数据的离散化 离散化是指将一个无穷大的集合中的若干个元素映射到一个有限的集合中&#xff0c;以便于对那个无穷大的集合进行操作。 在很多情况下&#xff1a;对于一个规定在Z范围内的整数范围&#xff0c;他有可能包含非常…

maven创建自定义web工程模板

一&#xff0c;先搭建好一个项目模板。 注意每个文件夹下都放一个文件占位&#xff0c;否则创建模板时会认为是空目录不进行创建。 注意项目文件夹名字 和 pom.xml 中<artifactId 和 <name 的名字都使用相同的名字&#xff0c;写一个好记的名字&#xff0c;因为后面生…

QT UI布局设置整理-边框设置

一、设置边距的方法 1、设置容器内部的内容控件的边距 //设置容器leftBar&#xff08;QWidget&#xff09;内部marginui->leftBar->setContentsMargins(10,10,0,0); 2、 设置内部控件之间的间距 //editWidget是一个QWidget ui->editWidget->layout()->setSpac…

【云原生kubernetes】k8s中控制器使用详解

一、什么是控制器 控制器是管理pod的中间层&#xff0c;只需要告诉Pod控制器&#xff0c;想要创建多少个什么样的Pod&#xff0c;它会创建出满足条件的Pod &#xff1b;控制器相当于一个状态机&#xff0c;用来控制Pod的具体状态和行为 &#xff1b;controller会自动创建相应的…

【数据库概论】3.2 SQL的查询、更新和删除语句

一、 数据查询 SQL提供SELECT语句用于查询&#xff0c;一般格式为&#xff1a; 根据WHERE子句条件表达式从FROM子句指定的基本表、视图中找出满足条件的元组 GROUP BY语句则用作将结果按照<列名1>的值进行分组&#xff0c;该属性列值相等的元组为一个组&#xff1b;ORD…