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 ...
随机推荐
- layui 时间插件laydate中动态设置改变min和max值
<div class="layui-inline"> <label class="layui-form-label">申请时间</ ...
- 「NGK每日快讯」12.29日NGK第56期官方快讯!
- java放射机制的学习心得
概述 之前在了解Spring的类加载机制的时候,了解了java的反射机制.但是,我对反射理解一直不深.也一直有点疑惑:Spring为什么利用反射创建对象?直接new对象和依靠反射创建对象有什么区别?什 ...
- 这一篇TCP总结请收下
前言 很高兴遇见你~ TCP这些东西,基本每个程序猿都或多或少是掌握的了.虽然感觉在实际开发中没有什么用武之处,但,面试他要问啊 而最近大家伙过完年,也都在准备春招,我也一样.阅读了一些okHttp源 ...
- 错误信息:...\output\project.axf: error: l6218e: undefined symbol usart1_confing (referred from main.o).
说明:此文档知识用来记录,顺便给大家作为参考,如有错误的地方请大家多多指正,在下内心定会感激不尽. 前言:关于这个问题,我曾花了一个下午在网上寻找,网上的说法五花八门,我办法试尽,但遍寻无果.由此我认 ...
- Win32API使用技巧 -- 置顶应用
Win32提供了SetForegroundWindow方法可以将应用设置到前台并激活,但是在某些场景下,只调用该接口会返回0,即设置失败.比如如下场景: 当前前台应用为一个全屏的应用,非前台应用的进程 ...
- Docker镜像构建原理解析(不装docker也能构建镜像)
在devops流程里面 构建镜像是一个非常重要的过程,一般构建镜像是写dockerfile文件然后通过docker client来构建的image. docker client 会先检查本地有没有im ...
- 如何理解JavaScript中的函数
转: 如何理解JavaScript中的函数 JS中的函数简介 JS中的函数是一种通过调用来完成具体业务的一段代码块.最核心的目的是将可重复执行的操作进行封装,然后供调用方无限制的调用. JS中的函数的 ...
- 洛谷 P4747 [CERC2017]Intrinsic Interval 线段树维护连续区间
题目描述 题目传送门 分析 考虑对于 \([l,r]\),如何求出包住它的长度最短的好区间 做法就是用一个指针从 \(r\) 向右扫,每次查询以当前指针为右端点的最短的能包住 \([l,r]\) 的好 ...
- CVE-2017-10271 XMLDecoder 反序列化
漏洞描述:WebLogic的 WLS Security组件对外提供webservice服务,其中使用了XMLDecoder来解析用户传入的XML数据,在解析的过程中出现反序列化漏洞,可以构造请求对运行 ...