1. AOF持久化

Redis AOF 持久化是通过保存Redis服务器所执行的写命令来记录数据库状态的。

2. RDB持久化与AOF持久化的区别

  • RDB持久化

    • RDB持久化通过保存数据中的键值对来记录数据库状态
    • RDB文件是一个压缩的二进制文件
  • AOF持久化
    • AOF 持久化是通过保存Redis服务器所执行的写命令来记录数据库状态的
    • AOF 文件是纯文本格式文件,所有写入AOF文件的命令都是以Redis请求协议格式保存的

3. AOF持久化的实现

AOF持久化功能的实现可以分为命令追加(append)、文件写入、文件同步(sync)三个步骤。

3.1 命令追加

当AOF持久化功能处于打开状态时,服务器在执行完一个写命令后,会以协议格式将被执行的写命令追加到服务器状态的 aof_buf缓存区的末尾。

3.2 AOF文件的写入和同步

文件的写入和同步
为了提高文件的写入效率,在现代操作系统中,当用户调用 write 函数,将一些数据写入到文件的时候,操作系统通常会将写入数据暂时保存在一个内存缓冲区里面,等到缓冲区空间被填满,或者超过了指定的时限后,才真正地将缓冲区中的数据写入到磁盘里面。
这种做法虽然提高了效率,但也为写入数据带来了安全性问题,因为如果计算机发生停机,那么保存在内存缓冲区里面的写入数据将会丢失。
为此,系统提供了 fsync 和 fdatasync 两个同步函数,它们可以强制操作系统立刻将缓冲区中的数据写入到硬盘里边,从而确保写入数据的安全性。

Redis中通过配置 appendsync 选项的值来决定AOF文件写入和同步的行为。
appendsync 选项不同的取值产生的持久化行为以及对应的持久化效率和数据安全性如下表:

appendsync选项的值 持久化行为 效率 安全性
always 将 aof_buf 缓冲区中的所有内容写入并同步到AOF文件(保存到磁盘) 最慢 最安全,即使故障停机,AOF持久化也只会丢失一个事件循环中所产生的命令数据
everysec 将 aof_buf 缓冲区中的所有内容写入到AOF文件,如果上次同步的AOF文件的时间距离现在超过一秒钟,那么再次对AOF文件进行同步,并且这个同步操作是由一个子线程专门负责执行 足够快 故障停机,数据库也只丢失一秒钟的命令数据
no 将 aof_buf 缓冲区中的所有内容写入AOF文件,但并不对AOF文件进行同步,何时同步由操作系统决定 最快 故障停机时,会丢失上次同步AOF文件之后所有写命令数据

4. AOF重写

为了解决AOF文件体积膨胀的问题,Redis提供了AOF文件重写功能。

AOF文件重写是通过读取服务器当前数据库状态来实现的,与现有的AOF文件没任何关系,不会对现有的AOF文件进行任何的读取、分析或者写入操作。

Redis 将AOF重写程序放到子进程中直行,防止服务器因AOF重写而无法处理请求。

Redis使用子进程处理AOF重写的好处:
- 子进程进行AOF重写期间,服务器进程可以继续处理命令请求
- 子进程带有服务器进程的数据副本,使用子进程而不是线程,可以在避免使用锁的情况下,保证数据的安全性

4.1 如何解决子进程AOF重写期间,服务器数据库状态与重写后的AOF文件数据库状态不一致的情况

为了解决数据不一致的问题,Redis服务器设置了一个AOF重写缓冲区,这个缓存区在服务器创建了子进程之后开始使用,当Redis服务器执行完一个写命令后,它会同时将这个写命令发送给AOF缓存区和AOF重写缓存区。

当子进程完成重写工作后,向父进程发送一个信号,父进程接收到信号后,调用信号处理函数(这个过程服务器进程是阻塞的,不能处理新命令请求):

  • 将AOF 重写缓冲区中的所有内容写入新的AOF文件
  • 原子地覆盖现有的AOF文件

《Redis设计与实现》- AOF持久化的更多相关文章

  1. redis的 rdb 和 aof 持久化的区别 [转]

    aof,rdb是两种 redis持久化的机制.用于crash后,redis的恢复. rdb的特性如下: Code: fork一个进程,遍历hash table,利用copy on write,把整个d ...

  2. redis的 rdb 和 aof 持久化的区别

    aof,rdb是两种 redis持久化的机制.用于crash后,redis的恢复. rdb的特性如下: Code: fork一个进程,遍历hash table,利用copy on write,把整个d ...

  3. 对比 Redis 中 RDB 和 AOF 持久化

    概念 Redis 是内存数据库,数据存储在内存中,一旦服务器进程退出,数据就丢失了,所以 Redis 需要想办法将存储在内存中的数据持久化到磁盘. Redis 提供了两种持久化功能: RDB (Red ...

  4. Redis的RDB和AOF持久化

    RDB 持久化:在指定的时间间隔内生成数据集的时间点快照. AOF 持久化:记录服务器执行的所有写操作命令,并在服务器启动时,通过重新执行这些命令来还原数据集. RDB 它只保存了 Redis 在某个 ...

  5. Redis之RDB和AOF持久化介绍

    什么是数据库状态 redis是一个键值对的数据库服务器,服务器中通常包含中任意个非空的数据库,而每个数据库又可以包含任意个键值对,为了方便起见,我们将服务器中的非空数据库以及他们的键值对统称为数据库状 ...

  6. Redis中RDB和AOF持久化区别和联系

    RDB和AOF持久化   ​RDB持久化 RDB是什么? 原理是redis会单独创建(fork) 一个与当前进程一模一 样的子进程来进行持久化,这个子进程的所有数据(变量.环境变量,程序程序计数器等) ...

  7. Redis 详解 (七) AOF 持久化

    目录 1.AOF简介 2.AOF 配置 3.开启 AOF 4.AOF 文件恢复 5. AOF 重写 6.AOF的优缺点 上一篇文章我们介绍了Redis的RDB持久化,RDB 持久化存在一个缺点是一定时 ...

  8. redis的rdb与aof持久化机制

    Redis提供了两种持久化方案:RDB持久化和AOF持久化,一个是快照的方式,一个是类似日志追加的方式 RDB快照持久化 RDB持久化是通过快照的方式,即在指定的时间间隔内将内存中的数据集快照写入磁盘 ...

  9. Redis - 2 - 聊聊Redis的RDB和AOF持久化 - 更新完毕

    1.RDB 1.1).RDB是什么? RDB,全称Redis Database RDB是Redis进行持久化的一种方式,当然:Redis默认的持久化方式也是RDB 1.2).Redis配置RDB 1. ...

  10. Redis学习笔记(九) AOF持久化

    除了RDB持久化功能之外,Redis还提供了AOF持久化功能.与RDB持久化通过保存数据库中的键值对来记录数据库状态不同,AOF持久化是通过保存Redis服务器所执行的写命令来记录数据库状态的. 服务 ...

随机推荐

  1. css3重点回顾字体

    1.字体 免费字体下载https://cn.ffonts.net/

  2. C# 获取格式

    1. 身份证日期 DateTime.ParseExact((IDCard.Substring(6, 8)), "yyyyMMdd", System.Globalization.Cu ...

  3. Visual Studio 要求导入 pfx 密钥以及导入后依然要求导入的解决办法

    本文为个人博客备份文章,原文地址: http://validvoid.net/visual-studio-pfx-import/ 导入密钥 在使用 Visual Studio 生产项目时,使用 pfx ...

  4. 微信小程序里使用 Redux 状态管理

    微信小程序里使用 Redux 状态管理 前言 前阵子一直在做小程序开发,采用的是官方给的框架 wepy , 如果还不了解的同学可以去他的官网查阅相关资料学习:不得不说的是,这个框架确相比于传统小程序开 ...

  5. Java学习笔记——集合

    类集简介 从JDK1.2开始Java引入了类集开发框架,所谓的类集指的就是一套动态对象数组的实现方案,在实际开发之中没有有何一项开发可以离开数组,但是传统的数组实现起来非常的繁琐.而且长度是其致命伤, ...

  6. mysql-5.7安装配置指导

    mysql 安装 yum 安装mysql 源码编译安装mysql 通过yum安装 下载yum仓库配置安装包 MySQL Yum Repository http://dev.mysql.com/down ...

  7. Springboot中SpringMvc拦截器配置与应用(实战)

    一.什么是拦截器,及其作用 拦截器(Interceptor): 用于在某个方法被访问之前进行拦截,然后在方法执行之前或之后加入某些操作,其实就是AOP的一种实现策略.它通过动态拦截Action调用的对 ...

  8. PowerMock学习笔记,对单例的测试方法

    对单例进行mock 单例类 public class PmModelHandler { // 包含要mock掉的成员变量 private static LogService logger = LogS ...

  9. 关于Mysql中文乱码问题该如何解决(乱码问题完美解决方案)(转)

    这篇文章给大家介绍关于Mysql中文乱码问题该如何解决(乱码问题完美解决方案)的相关资料,还给大家收集些关于MySQL会出现中文乱码原因常见的几点,小伙伴快来看看吧   最近两天做项目总是被乱码问题困 ...

  10. 08、Spark常用RDD变换

    08.Spark常用RDD变换 8.1 概述 Spark RDD内部提供了很多变换操作,可以使用对数据的各种处理.同时,针对KV类型的操作,对应的方法封装在PairRDDFunctions trait ...