Redis持久化——AOF

news/2024/11/20 2:22:18/

介绍

Redis是运行在内存中的数据库,当我们关闭了Redis服务器后,内存中的数据会丢失吗?
答案是不会的,因为Redis有持久化功能,能够将内存中的数据保存到磁盘中的文件,以此来实现数据的永久保存。
在Redis中,有两种持久化功能:

  • RDB持久化功能,简称RDB快照
  • AOF持久化功能,简称AOF日志

关于RDB快照,建议先去看看我的这篇文章Redis持久化——RDB快照_秋天code的博客-CSDN博客

AOF日志

AOF的全称是,Append Only File,日志文件追加写。
AOF日志记录的是每次对数据进行修改的命令,通过这些命令就可以恢复数据库状态
注意:读命令是不会被记录到AOF日志中的,因为不涉及数据的变化。
Redis每执行一条写命令,就会把该命令以追加的方式写入到AOF日志文件中,然后在Redis服务器启动时,就会通过此日志文件中的命令,来恢复数据库状态,大致的工作流程:

在Redis中,默认开启的是RDB持久化功能,并没有开启AOF持久化功能,因此我们修改配置项来开启AOF持久化功能:

appendonly yes // 表示开启AOF持久化(no关闭)
appendfilename "appendonly.aof" // AOF日志文件的名称

AOF日志写回时机

对AOF日志文件追加写的操作是IO操作,肯定是比内存操作要慢的,又因为Redis是单线程的,所以IO操作会阻塞后面的请求,因此为了提高Redis的性能,会在内存中有一块缓冲区,专门用来存放每次写命令产生的AOF日志,将缓冲区中的命令批量写回到AOF文件中。

先来看AOF日志写入的详细流程图:

Redis中提供了3种写回策略,控制以上的第三步,即调用操作系统的IO操作的时机。

在Redis的配置文件中,appendsync配置项就是用来配置AOF的回写策略,有三个值AlwaysEverysecNo

  • Always,每次执行写操作命令完成后,同步将AOF日志写回磁盘
  • Everysec每秒,每次执行写操作命令,会先记录此命令到内存中的AOF缓冲区,隔1秒后,将缓冲区中的AOF日志写回到AOF文件中。
  • No,不由Redis控制写回硬盘的时机,转交给操作系统控制。也就是说,每次写操作命令执行完后,先将命令写入到内存中的AOF缓冲区,再由操作系统来决定何时将此缓冲区中的内存写回到磁盘文件中。

总结这三种策略:

AOF重写机制

AOF日志文件,随着执行写操作的命令次数越来越多,文件的大小会越来越大。
当一个AOF日志文件过大时,就会严重影响性能:当Redis服务器启动时,需要从AOF日志文件中恢复数据,Redis是单线程的,会逐条执行其中的命令,当AOF文件过大时,命令也会很多,整个数据恢复过程就会很慢。

Redis为了避免AOF日志文件过大的问题,提供了AOF重写机制,当AOF文件的大小超过设定的阈值时,Redis就会启动AOF重写机制,来压缩AOF文件
具体的原理是:
AOF重写机制是在重写时,读取当前数据库中的所有键值对,然后将每一个键值对用一条命令记录到新的AOF文件中,等到全部记录完成后,就会将新的AOF文件替换掉旧的AOF文件,AOF文件的体积会大大缩小。(因为一条记录、键值对,可能会对应多次写操作,我们只需要记录最终此键值对的状态即可,因此就会把原来旧的AOF文件中的对同一键值对写的命令,最终替换成一条写命令,所以AOF文件体积会缩小)

AOF和RDB对比

  • AOF日志文件是文本文件,记录的是所有的写命令;而RDB文件是二进制文件,记录的就是数据本身。
  • AOF日志恢复数据的速度较慢,即在服务器启动时占用的时间较长。RDB文件的载入会较快。(因为AOF持久化功能会把AOF日志中的每条命令再执行一遍,当AOF日志非常大时,需要执行的命令就非常多,而且Redis是单线程的,需要一条一条的执行,所以恢复数据的效率较低)

参考文章

  • 《Redis设计与实现》
  • AOF 持久化是怎么实现的? | 小林coding

http://www.ppmy.cn/news/1039164.html

相关文章

笔记:移植xenomai到nuc972(1)

xenomai是一个实时操作系统,想要使用它,先要移植I-pipe补丁 补丁在xenomai / ipipe-arm GitLab 我的内核是4.4-248的,合并上去会有几个小错误,随便改改就好 编译内核没有报错之后,接下来需要修改arch/arm/mach-nuc970/time.c 修改方法参考补丁里面其它设备的定时器驱动,就…

面向对象编程(OOP):Python中的抽象与封装

文章目录 🍀引言🍀 类与对象🍀封装🍀继承🍀多态🍀面向对象编程的优势🍀使用面向对象编程的场景🍀实例化与构造函数🍀 成员属性和类属性🍀魔术方法&#x1f34…

数据结构—排序

8.排序 8.1排序的概念 什么是排序? 排序:将一组杂乱无章的数据按一定规律顺序排列起来。即,将无序序列排成一个有序序列(由小到大或由大到小)的运算。 如果参加排序的数据结点包含多个数据域,那么排序往…

联想拯救者笔记本Win11系统键盘无法打字解决参考方法

一位好机友新购买的联想拯救者笔记本在使用过程中突然发现整个键盘都不能使用了、不能打字、按任何按键都没有反应,只有鼠标能正常操作;那么这是什么问题呢?能不能是笔记本的键盘坏了呢?还是笔记本出现了什么故障而引起键盘失灵呢…

极客时间-《左耳听风》

技术基础 02 程序员如何用技术变现(下) 在学习技术的过程一定要多问自己两个问题:“一,这个技术解决什么问题?为什么别的同类技术做不到?二,为什么是这样解决的?有没有更好的方式&…

创建和使用分区

创建和使用分区 创建一个名为 /home/curtis/ansible/partition.yml 的 playbook: 该palybook包含一个paly,该paly在balancers主机组的主机上运行: 在设备vdb上创建单个主分区,编号为1,大小为1500MiB 使用ext4文件系统…

Docker的基本操作

目录 一、Docker 镜像操作 搜索镜像 获取镜像 镜像加速下载 查看镜像信息 查看下载到本地的所有镜像 根据镜像的唯一标识 ID 号,获取镜像详细信息 为本地的镜像添加新的标签 删除镜像 存出镜像:将镜像保存成为本地文件 载入镜像:将镜像文件导入到镜像库中 上传…

服务链路追踪

一、服务链路追踪导论 1.背景 对于一个大型的几十个、几百个微服务构成的微服务架构系统,通常会遇到下面一些问题,比如: 如何串联整个调用链路,快速定位问题?如何理清各个微服务之间的依赖关系?如何进行…