Redis-AOF日志与RDB快照
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快照的更多相关文章
- redis:aof恢复与rdb服务器间迁移
1. aof恢复与rdb服务器间迁移: 1.1. Aof恢复: 如果不小心执行了flushdb或flushall了怎么办? (1)立马执行命令:shutdown nosave 关闭服务器,为了防止其他 ...
- 04 AOF日志:宕机了,Redis如何避免数据丢失
接下来两篇将记录Redis持久化存储两大技术:AOF日志.RDB快照 本篇重点 "AOF日志实现""AOF日志三种写回策略""AOF重写--避免日志过 ...
- Redis数据持久化(RDB、AOF)
1. 简介 Redis作为内存型数据库,数据都保存在内存中,如果重启或意外宕机后,数据会全部丢失.因此,Redis提供了完善的持久化机制,将内存中的数据持久化到磁盘上,避免了完整性和安全性的问题, ...
- 图解 Redis | 不多说了,这就是 RDB 快照
大家好,我是小林. 虽说 Redis 是内存数据库. 但是它为数据的持久化提供了两个技术,分别是「 AOF 日志和 RDB 快照」. 这两种技术都会用各用一个日志文件来记录信息,但是记录的内容是不同的 ...
- redis RDB快照和AOF日志持久化配置
Redis持久化配置 Redis的持久化有2种方式 1快照 2是日志 Rdb快照的配置选项: save 900 1 // 900内,有1条写入,则产生快照 save 300 1000 ...
- redis快照持久化和aof日志持久化
持久化就是即使断电/重启需要存储的数据不会丢失,即将数据存储在设备中,一般存在硬盘内 redis的持久化有2种方式 :1-rdb快照 2-aof日志,可以通过配置redis.conf文件进行配置 r ...
- 解决---MISCONF Redis被配置为保存RDB快照,但目前无法在磁盘上存留。可能修改数据集的命令被禁用。请检查Redis日志,了解有关错误的详细信息。
解决---MISCONF Redis被配置为保存RDB快照,但目前无法在磁盘上存留.可能修改数据集的命令被禁用.请检查Redis日志,了解有关错误的详细信息. 出现bug: 在学习celery,将数据 ...
- 【Azure Redis 缓存】Windows和Linux系统本地安装Redis, 加载dump.rdb中数据以及通过AOF日志文件追加数据
任务描述 本次集中介绍使用Windows和Linux()搭建本地Redis服务器的步骤,从备份的RDB文件中加载数据,以及如何生成AOF文件和通过AOF文件想已经运行的Redis追加数据. 操作步骤 ...
- Redis的持久化的两种方式drbd以及aof日志方式
redis的持久化配置: 主要包括两种方式:1.快照 2 日志 来看一下redis的rdb的配置选项和它的工作原理: save 900 1 // 表示的是900s内,有1条写入,则产生快照 save ...
随机推荐
- macOS finder show hidden files
macOS finder show hidden files 显示 MacOS 上的隐藏文件和文件夹 https://zh.wikihow.com/显示Mac-OS-X上的隐藏文件和文件夹 $ def ...
- django学习-6.模板templates
1.前言 首先,我们要知道html是一门静态语言,里面没法传一些动态参数,也就是一个写死的html页面. 那么,如果我们想实现在一个html页面里传入不同的参数对应的参数值,这就可以用django框架 ...
- [报错集]ubuntu中安装oracle java报错
1.因为版本更新,JAVA15以前的版本都已经没办法下载了,所以要使用oracle java必须使用最近的java15 $ sudo apt-get install oracle-java15-ins ...
- 微信小程序:上滑触底加载下一页
给商品列表页面添加一个上滑触底加载下一页的效果,滚动条触底之后就发送一个请求,来加载下一页数据, 先在getGoodsList中获取总条数 由于总页数需要再另外的一个方法中使用,所以要把总页数变成一个 ...
- Svelte 极简入门
弹指之间即可完成. 注意:原文发表于 2017-8-7,随着框架不断演进,部分内容可能已不适用. Svelte 是一种新型框架. 以往我们要引入一个框架或者类库,可以通过在页面上放置 ...
- Coposition 详解
LifeCycle Hooks 在新版的生命周期函数,可以按需导入到组件中,且只能在setup()函数中使用. import { onMounted, onUnmounted } from 'vue' ...
- Tango with django 1.9 中文——3.Django基础
让我们开始运用Django.本章主要是给你一个关于创建新项目和新应用过程的概览.在本章的末尾,你将建立起一个简单的由Django驱动的网站. 3.1 配置测试 让我们测试以下你的Python和Djan ...
- 翻译:《实用的Python编程》03_00_Overview
目录 | 上一节 (2 处理数据) | 下一节 (4 类和对象) 3. 程序组织 到目前为止,我们已经学习了一些 Python 基础知识并编写了一些简短的脚本.但是,当开始编写更大的程序时,我们会想要 ...
- CTS camera的基础操作和debug
手机端 设置永久不锁屏 1 CTS 进入cts目录tools 运行以下命令 ./cts-tradefed adb devices找设备数串 整跑 run cts -m CtsCameraTestCas ...
- cat常用参数
cat 命令格式 cat [选项] [文件] -A, --show-all:等价于 -vET. -b --number-nonblank:和 -n 相似,只不过对于空白行不编号. -e:等价于&qu ...