一文了解:Redis的AOF持久化
Redis的AOF持久化
每当Redis-Server接收到写数据时,就把命令以文本形式追加到AOF文件里,当重启Redis服务时,AOF文件里的命令会被重新执行一次,重新恢复数据。当AOF过大时将重写AOF文件。
工作原理
> lpush list 1 2 3 4
(integer) 4
127.0.0.1:6379> lrange list 0 -1
1) "4"
2) "3"
3) "2"
4) "1"
127.0.0.1:6379> lpop list
"4"
127.0.0.1:6379> lrange list 0 -1
1) "3"
2) "2"
3) "1"
appendonly.aof文件中
*2
$6
SELECT
$1
0
*6
$5
lpush
$4
list
$1
1
$1
2
$1
3
$1
4
*2
$4
lpop
$4
list
可以看到上面的示例中写操作有lpush和lpop命令,在AOF文件中存在lpush和lpop。SELECT命令为AOF程序自动加上的选择数据库。
AOF命令写入的内容为文本协议格式,如:命令lpush list 1 2 3 4 的文本形式为"*6\r\n$5\r\nlpushr\n$4r\nlist\r\n$1\r\n1$1\r\n2$1\r\n3$1\r\n4\r\n"。将文本内容追加到aof_buf(缓冲区)中,AOF缓冲区根据相应的策略同步写入AOF文件中,当AOF文件越来越大时,将AOF文件重写。

启动AOF持久化
在redis.conf文件中
appendonly no #写成yes,打开AOF持久化
AOF写入频率
# appendfsync always
appendfsync everysec # 默认
# appendfsync no
- alaws:总是同步到AOF文件,每一个命令都写入,安全,速度慢
- everysec:每秒写入一次,安全性好,最多丢失1秒钟的数据
- no:写入AOF文件工作交给操作系统,由操作系统写入AOF文件,安全性一般
文件
aof文件目录通过RDB文件目录,他们共享同一个目录
dir ./
appendfilename "appendonly.aof"
通过config set dir {newDir} 动态修改dir配置
通过config set dbfilename {appendfilename} 动态修改AOF文件名称
重写
AOF文件过大时,Redis将fork()一个子进程对内存数据进行比那里逆化成Redis命令,序列化文本格式后写入到新的AOF文件中。然后将重写时发生的增量AOF文件追加到新的AOF文件中,最后替换旧的AOF文件。
自动重写
auto-aof-rewrite-percentage 100 # 比上次重写时文件增大了100%就重写AOF文件
auto-aof-rewrite-min-size 64mb # AOF文件至少超过为64M时重写AOF文件
自动重写必须满足:当前AOF文件大小 > auto-aof-rewrite-min-size &&(当前文件AOF文件大小减去上次重写时AOF文件大小)除以 上次重写时AOF文件大小 = auto-aof-rewrite-percentage
手动重写
> bgrewriteaof
Background append only file rewriting started
优缺点
优点
- 比RDB文件可靠,everysec模式下只丢1秒数据。
- AOF文件为纯文本文件。文件协议格式容易恢复成Redis命令。
- AOF文件太大会进行自动重写。
缺点
- 同等数据下,比RDB文件大。
- 同步过程中Redis主进程会被阻塞,everysec是个折中方案。
数据恢复
Redis读取AOF文件数据还原过程
- 创建一个不带网络的客户端
- 读取AOF文件内容,还原成命令
- 将命令在1中的客户端执行
- 重复2,3的过程
结语
本人深知水平有限,欢迎指正本文错误之处。

一文了解:Redis的AOF持久化的更多相关文章
- 12.redis的AOF持久化深入讲解各种操作和相关实验
1.AOF持久化的配置 2.AOF持久化的数据恢复实验3.AOF rewrite4.AOF破损文件的修复5.AOF和RDB同时工作 ---------------------------------- ...
- Golang 实现 Redis(4): AOF 持久化与AOF重写
本文是使用 golang 实现 redis 系列的第四篇文章,将介绍如何使用 golang 实现 Append Only File 持久化及 AOF 文件重写. 本文完整源代码在作者GithubHDT ...
- redis 开启AOF 持久化
redis 开启AOF 找到redis 安装目录 打开 redis.conf 修改以下参数: appendonly yes (默认no,关闭)表示是否开启AOF持久化: append ...
- Redis数据持久化之AOF持久化
一.RDB持久化的缺点创建RDB文件需要将服务器所有的数据库的数据都保存起来,这是一个非常耗费资源和时间的操作,所以服务器需要隔一段时间才能创建一个新的RDB文件,就也是说创建RDB文件的操作不能执行 ...
- 使用AOF持久化文件实现还原Redis数据库并得到RDB持久化文件
目录 1 编写本文的初衷 2 具体实施 2.1 Redis持久化概念简介 2.2 获取指定Redis的AOF持久化文件 2.3 把Redis的持久化AOF文件转换为RDB文件 1 编写本文的初衷 因为 ...
- redis源码分析(四)--aof持久化
Redis aof持久化 Redis支持两种持久化方式:rdb与aof,上一篇文章中已经大致介绍了rdb的持久化实现,这篇文章主要介绍aof实现. 与rdb方式相比,aof会使用更多的存储空间,因为它 ...
- 图解 Redis | 不就是 AOF 持久化嘛
AOF 日志 试想一下,如果 Redis 每执行一条写操作命令,就把该命令以追加的方式写入到一个文件里,然后重启 Redis 的时候,先去读取这个文件里的命令,并且执行它,这不就相当于恢复了缓存数据了 ...
- Linux 安装redis,redis发布订阅,持久化
安装redis 1.安装redis的方式 -yum (删除这个yum安装的redis,我们只用源码编译安装的) -rpm -源码编译 2.删除原本的redis yum remove redis -y ...
- [翻译自官方]什么是RDB和AOF? 一文了解Redis持久化!
概述 本文提供Redis持久化技术说明, 建议所有Redis用户阅读. 如果您想更深入了解Redis持久性原理机制和底层持久性保证, 请参考文章 揭秘Redis持久化: http://antire ...
随机推荐
- Django rest framework(1)----认证
目录 Django组件库之(一) APIView源码 Django restframework (1) ----认证 Django rest framework(2)----权限 Django ...
- 记一次linux服务器入侵应急响应
近日接到客户求助,他们收到托管电信机房的信息,通知检测到他们的一台服务器有对外发送攻击流量的行为.希望我们能协助排查问题. 一.确认安全事件 情况紧急,首先要确认安全事件的真实性.经过和服务器运维人员 ...
- Docker笔记(四):Docker镜像管理
原文地址:http://blog.jboost.cn/2019/07/16/docker-4.html 在Docker中,应用是通过容器来运行的,而容器的运行是基于镜像的,类似面向对象设计中类与对象的 ...
- shell_umask用法
我曾经用touch命令创建一个文件script,默认的权限是"rw-r- -r- -",有的朋友就有可能问为什么是这种组合?其实,这正是umask命令捣的鬼.在linux上输入:u ...
- MyBatis从入门到精通:使用XML方式(映射文件之类的)
2.3节笔记部分: package tk.mybatis.simple; public class Temp { } /* 2.2 使用XML方式 MyBatis使用了Java的动态代理可以直接通过接 ...
- IQueryable.Where中动态生成多个并或筛选Expression<Func<T, bool>>
直接上图
- go 学习笔记之初识 go 语言
Go 是一种开源编程语言,可以轻松构建简单,可靠,高效的软件. 摘录自 github: https://github.com/golang/go,其中官网(国外): https://golang.or ...
- string的赋值
string的赋值 string s1="123456"; 一: 只能在刚开始定义的时候用: (1) 从后往前赋值 string s2(s1,3); ...
- C#5.0新增功能01 异步编程
连载目录 [已更新最新开发文章,点击查看详细] 如果需要 I/O 绑定(例如从网络请求数据或访问数据库),则需要利用异步编程. 还可以使用 CPU 绑定代码(例如执行成本高昂的计算),对编写异步 ...
- JavaOOP 第二章继承
一 继承的概念 继承是java面向对象编程技术的一块基石,因为它允许创建分等级层次的类. 继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具 ...