AOF日志与RDB是Reids中两大持久化机制,当服务器或者Reids宕机的时候可以通过这两大机制恢复Redis的数据。

  先说说AOF日志吧,在执行一条操作请求时,Redis先将命令在内存中执行,之后再将命令写到AOF日志中,与我们熟悉的MySQL的redo log日志先写日志再执行sql的顺序刚好相反。

  这么做的好处主要有两点:

    • 先执行命令再写入AOF日志确保命令不存在语法错误能正常的被执行;
    • 不阻塞主线程;

  在Redis中AOF日志有三种写回的策略:

    • Always,同步写回。执行完命令立即写入AOF文件;
    • Everysec,每秒写回。执行完命令后将命令写入缓冲区,每秒将缓冲区命令写入AOF文件;
    • No,由操作系统写回。执行完命令后将命令写入缓冲区,由操作系统决定何时将缓冲区命令写入AOF文件;

  

  由于持续不断的操作Redis服务,这时AOF日志文件的将持续变大,将会带来一些性能上的问题:

    • 系统无法保存过大的文件;
    • AOF文件过大时将会影响命令写入的效率;
    • 如果发生宕机,AOF文件过大会导致数据恢复变得缓慢;

  针对AOF文件过大问题Redis采用重写AOF文件的方式来避免AOF文件过大带来的性能问题。与AOF日志由主线程写入的方式不同,AOF重写由后台子线程bgrewriteaof 来完成的,这也是为了避免阻塞主线程,导致数据库性能下降。

  重写的过程主要体现在两个方面:一个拷贝,两处日志。

  Redis中通过auto-aof-rewrite-min-size、auto-aof-rewrite-percentage来判断是否触发重写机制,当AOF文件大小同时超出这两个参数设定的值后就会触发AOF重写。

  当触发AOF重写后,主线程会fork一个子线程bgrewriteaof ,同时将复制一份主线程的页表(一个拷贝)给子线程,这样子线程就能访问到内存中的数据了,在不影响主线程的情况下逐一将数据转成命令记录重写日志。

  在AOF日志重写过程中,当有新的操作命令的时候,Redis会将命令写入AOF缓冲区的同时也会写入重写AOF的缓冲区(两处日志),当重写完成后,重写缓冲区的命令会写入新的AOF文件中。此时,新的AOF文件就可以代替旧的AOF文件了。

  

  你可能会疑惑为什么重写后的AOF文件会比较小呢?

  因为旧的AOF文件记录着每一条操作命令,可能存在多条命令执行同一个数据的情况,而AOF重写是将内存中的数据转成命令存储这样一条数据就只会存在一条命令,从而达到缩小AOF文件文件大小的目的。

  与AOF日志相比RDB快照的逻辑就相对简单一些。

  RDB快照可以理解为Redis数据的全量备份,Redis通过两个命令来生成RDB文件:

    • save:在主线程中执行,会阻塞主线程;
    • bgsave:创建一个子线程去写入RDB文件,避免了主线程阻塞,Redis默认配置;

  首先在Redis主线程会fork一个子线程bgsave,同时复制一份主线程页表给bgsave,这样bgsave子线程就能读到主线程的内存中的数据了将其写到RDB快照中,所以不会影响主线程的读操作。

  但是,如果是一个操作请求这时Redis为了保证正常操作请求会借助系统的写时复制技术(Copy-On-Write, COW),当有操作请求时,主线程会申请一份新的内存空间存放数据同时修改自己的页表映射。

  这样既保证了快照的完整性,也保证了主线程的正常操作。

  在Redis4.0后提出了混合使用AOF和RDB快照的方法,先通过全量备份Redis数据的RDB快照,之后通过AOF日志文件做增量备份。

  

Redis-AOF日志与RDB快照的更多相关文章

  1. redis:aof恢复与rdb服务器间迁移

    1. aof恢复与rdb服务器间迁移: 1.1. Aof恢复: 如果不小心执行了flushdb或flushall了怎么办? (1)立马执行命令:shutdown nosave 关闭服务器,为了防止其他 ...

  2. 04 AOF日志:宕机了,Redis如何避免数据丢失

    接下来两篇将记录Redis持久化存储两大技术:AOF日志.RDB快照 本篇重点 "AOF日志实现""AOF日志三种写回策略""AOF重写--避免日志过 ...

  3. Redis数据持久化(RDB、AOF)

    1. 简介   Redis作为内存型数据库,数据都保存在内存中,如果重启或意外宕机后,数据会全部丢失.因此,Redis提供了完善的持久化机制,将内存中的数据持久化到磁盘上,避免了完整性和安全性的问题, ...

  4. 图解 Redis | 不多说了,这就是 RDB 快照

    大家好,我是小林. 虽说 Redis 是内存数据库. 但是它为数据的持久化提供了两个技术,分别是「 AOF 日志和 RDB 快照」. 这两种技术都会用各用一个日志文件来记录信息,但是记录的内容是不同的 ...

  5. redis RDB快照和AOF日志持久化配置

    Redis持久化配置 Redis的持久化有2种方式   1快照  2是日志 Rdb快照的配置选项: save 900 1      // 900内,有1条写入,则产生快照 save 300 1000 ...

  6. redis快照持久化和aof日志持久化

    持久化就是即使断电/重启需要存储的数据不会丢失,即将数据存储在设备中,一般存在硬盘内 redis的持久化有2种方式 :1-rdb快照  2-aof日志,可以通过配置redis.conf文件进行配置 r ...

  7. 解决---MISCONF Redis被配置为保存RDB快照,但目前无法在磁盘上存留。可能修改数据集的命令被禁用。请检查Redis日志,了解有关错误的详细信息。

    解决---MISCONF Redis被配置为保存RDB快照,但目前无法在磁盘上存留.可能修改数据集的命令被禁用.请检查Redis日志,了解有关错误的详细信息. 出现bug: 在学习celery,将数据 ...

  8. 【Azure Redis 缓存】Windows和Linux系统本地安装Redis, 加载dump.rdb中数据以及通过AOF日志文件追加数据

    任务描述 本次集中介绍使用Windows和Linux()搭建本地Redis服务器的步骤,从备份的RDB文件中加载数据,以及如何生成AOF文件和通过AOF文件想已经运行的Redis追加数据. 操作步骤 ...

  9. Redis的持久化的两种方式drbd以及aof日志方式

    redis的持久化配置: 主要包括两种方式:1.快照  2 日志 来看一下redis的rdb的配置选项和它的工作原理: save 900 1 // 表示的是900s内,有1条写入,则产生快照 save ...

随机推荐

  1. vs code & macOS services

    vs code & macOS services Mac OS X, Open Folder With VS Code (right click) https://github.com/Mic ...

  2. websockets & auto close & bug & solution

    websockets & auto close & bug & solution WS 连接总是被关闭 ??? refs https://wdd.js.org/websocke ...

  3. Dart 中断Future

    更多 中断future 方法1) import 'package:async/async.dart'; void main() { var get = CancelableOperation.from ...

  4. vue2.0用法以及环境配置

    一.配置环境搭建 1.安装node.js (可以去官网看) 2.安装git (推荐看廖雪峰文章,点击查看) 3.安装vue: cmd:npm install vue //最新稳定版本 npm inst ...

  5. 「NGK每日快讯」2021.1.7日NGK第65期官方快讯!

  6. 关于MacBook Air/Pro 外接显示器时,显示器黑屏无反应的解决方法,顺便求助M1芯片的mac 外接显示器如何开启Hidpi

    显示器黑屏,无反应,频繁闪烁的原因 先说结论,直接换type-c转DP的显示器连接线吧,如果显示器不支持dp接口,那自求多福吧. 事情是这样的,m1版本的macbook air 刚发布就马上入手了一台 ...

  7. Java 开源办公开发平台 O2OA V5.4.0 发布 | 设计元素搜索功能上线

    O2OA V5.4.0版本此次更新的设计元素搜索功能,可以让用户在海量的脚本.页面.表单.视图等信息中迅速锁定有价值的信息,以便提高用户获取信息的效率.拥有此搜索功能后,在开发过程中,可以加速定位脚本 ...

  8. 都学Python了,C++难道真的用不着了吗?

    本文首发 | 公众号:lunvey 人人都在学Python,我还学C++吗? 现在只要提及编程语言,得到的答复都是:学Python,有未来!   大家可能有一个误区,数据分析带火了Python,让人们 ...

  9. windows上传ipa文件到苹果开发者中心的教程

    转: windows上传ipa文件到苹果开发者中心的教程 我们在苹果开发者中心上架ios app的时候,需要使用xcode或transporter先上传ipa文件到开发者中心. 但是假如我们只是H5开 ...

  10. 浅谈.Net Core后端单元测试

    目录 1. 前言 2. 为什么需要单元测试 2.1 防止回归 2.2 减少代码耦合 3. 基本原则和规范 3.1 3A原则 3.2 尽量避免直接测试私有方法 3.3 重构原则 3.4 避免多个断言 3 ...