一篇文章彻底理解Redis持久化:RDB和AOF
为什么需要持久化?
Redis对数据的操作都是基于内存的,当遇到了进程退出、服务器宕机等意外情况,如果没有持久化机制,那么Redis中的数据将会丢失无法恢复。有了持久化机制,Redis在下次重启时可以利用之前持久化的文件进行数据恢复。理解和掌握Redis的持久机制,对于Redis的日常开发和运维都有很大帮助,也是在大厂面试经常被问到的知识点。Redis支持的两种持久化机制:
- RDB:把当前数据生成快照保存在硬盘上。
- AOF:记录每次对数据的操作到硬盘上。
接下来,我们详细了解一下这两种持久化机制。
欢迎关注微信公众号:万猫学社,每周一分享Java技术干货。
RDB持久化
RDB(Redis DataBase)持久化是把当前Redis中全部数据生成快照保存在硬盘上。RDB持久化可以手动触发,也可以自动触发。
手动触发
save
和bgsave
命令都可以手动触发RDB持久化。
save命令
执行save
命令会手动触发RDB持久化,但是save
命令会阻塞Redis服务,直到RDB持久化完成。当Redis服务储存大量数据时,会造成较长时间的阻塞,不建议使用。
> save
OK
执行后,Redis的日志中记录:
* DB saved on disk
bgsave命令
执行bgsave
命令也会手动触发RDB持久化,和save
命令不同是:Redis服务一般不会阻塞。Redis进程会执行fork操作创建子进程,RDB持久化由子进程负责,不会阻塞Redis服务进程。Redis服务的阻塞只发生在fork阶段,一般情况时间很短。
> bgsave
Background saving started
执行后,Redis的日志中记录:
* Background saving started by pid 2645
* DB saved on disk
* RDB: 0 MB of memory used by copy-on-write
* Background saving terminated with success
bgsave
命令的具体流程如下图:
- 执行
bgsave
命令,Redis进程先判断当前是否存在正在执行的RDB或AOF子线程,如果存在就是直接结束。 - Redis进程执行fork操作创建子线程,在fork操作的过程中Redis进程会被阻塞。
- Redis进程fork完成后,
bgsave
命令就结束了,自此Redis进程不会被阻塞,可以响应其他命令。 - 子进程根据Redis进程的内存生成快照文件,并替换原有的RDB文件。
- 子进程通过信号量通知Redis进程已完成。
欢迎关注微信公众号:万猫学社,每周一分享Java技术干货。
自动触发
除了执行以上命令手动触发以外,Redis内部可以自动触发RDB持久化。自动触发的RDB持久化都是采用bgsave
的方式,减少Redis进程的阻塞。那么,在什么场景下会自动触发呢?
- 在配置文件中设置了save的相关配置,如
sava m n
,它表示在m秒内数据被修改过n次时,自动触发bgsave
操作。 - 当从节点做全量复制时,主节点会自动执行
bgsave
操作,并且把生成的RDB文件发送给从节点。 - 执行
debug reload
命令时,也会自动触发bgsave
操作。 - 执行
shutdown
命令时,如果没有开启AOF持久化也会自动触发bgsave
操作。
RDB优点
RDB文件是一个紧凑的二进制压缩文件,是Redis在某个时间点的全部数据快照。所以使用RDB恢复数据的速度远远比AOF的快,非常适合备份、全量复制、灾难恢复等场景。
RDB缺点
每次进行bgsave
操作都要执行fork操作创建子经常,属于重量级操作,频繁执行成本过高,所以无法做到实时持久化,或者秒级持久化。
另外,由于Redis版本的不断迭代,存在不同格式的RDB版本,有可能出现低版本的RDB格式无法兼容高版本RDB文件的问题。
欢迎关注微信公众号:万猫学社,每周一分享Java技术干货。
AOF持久化
AOF(Append Only File)持久化是把每次写命令追加写入日志中,当需要恢复数据时重新执行AOF文件中的命令就可以了。AOF解决了数据持久化的实时性,也是目前主流的Redis持久化方式。
AOF持久化流程
AOF流程如下图:
- 命令追加(append):所有写命令都会被追加到AOF缓存区(aof_buf)中。
- 文件同步(sync):根据不同策略将AOF缓存区同步到AOF文件中。
- 文件重写(rewrite):定期对AOF文件进行重写,以达到压缩的目的。
- 数据加载(load):当需要恢复数据时,重新执行AOF文件中的命令。
文件同步策略
AOF持久化流程中的文件同步有以下几个策略:
- always:每次写入缓存区都要同步到AOF文件中,硬盘的操作比较慢,限制了Redis高并发,不建议配置。
- no:每次写入缓存区后不进行同步,同步到AOF文件的操作由操作系统负责,每次同步AOF文件的周期不可控,而且增大了每次同步的硬盘的数据量。
- eversec:每次写入缓存区后,由专门的线程每秒钟同步一次,做到了兼顾性能和数据安全。是建议的同步策略,也是默认的策略。
触发文件重写
AOF持久化流程中的文件重写可以手动触发,也可以自动触发。
- 手动触发:使用
bgrewriteaof
命令。 - 自动触发:根据auto-aof-rewrite-min-size和auto-aof-rewrite-percentage配置确定自动触发的时机。auto-aof-rewrite-min-size表示运行AOF重写时文件大小的最小值,默认为64MB;auto-aof-rewrite-percentage表示当前AOF文件大小和上一次重写后AOF文件大小的比值的最小值,默认为100。只用前两者同时超过时才会自动触发文件重写。
欢迎关注微信公众号:万猫学社,每周一分享Java技术干货。
AOF持久化配置
对AOF持久化的具体流程有了了解后,我们来看一下如何配置AOF。AOF持久化默认是不开启的,需要修改配置文件,如:
# appendonly改为yes,开启AOF
appendonly yes
# AOF文件的名字
appendfilename "appendonly.aof"
# AOF文件的写入方式
# everysec 每个一秒将缓存区内容写入文件 默认开启的写入方式
appendfsync everysec
# 运行AOF重写时AOF文件大小的增长率的最小值
auto-aof-rewrite-percentage 100
# 运行AOF重写时文件大小的最小值
auto-aof-rewrite-min-size 64mb
微信公众号:万猫学社
微信扫描二维码
获得更多Java技术干货

一篇文章彻底理解Redis持久化:RDB和AOF的更多相关文章
- Linux - redis持久化RDB与AOF
目录 Linux - redis持久化RDB与AOF RDB持久化 redis持久化之AOF redis不重启,切换RDB备份到AOF备份 确保redis版本在2.2以上 实验环境准备 备份这个rdb ...
- redis持久化 RDB与AOF
redis持久化 RDB与AOF RDB与AOF区别 rdb: 基于快照的持久化,速度更快,一般用做备份,主从复制也是依赖于rdb持久化功能 aof:以追加的方式记录redis操作日志的文件,可以最大 ...
- Redis持久化----RDB和AOF 的区别
关于Redis说点什么,目前都是使用Redis作为数据缓存,缓存的目标主要是那些需要经常访问的数据,或计算复杂而耗时的数据.缓存的效果就是减少了数据库读的次数,减少了复杂数据的计算次数,从而提高了服务 ...
- Redis持久化RDB、AOF
持久化的意思就是保存,保存到硬盘.第一次接触这个词是在几年前学习EF. 为什么要持久化 redis定义:Redis是一个开源(BSD许可),内存存储的数据结构服务器,可用作数据库,高速缓存和消息队列代 ...
- redis 之redis持久化rdb与aof
redis是内存型的数据库 重启服务器丢失数据 重启redis服务丢失数据 断电丢失数据 Redis是一种内存型数据库,一旦服务器进程退出,数据库的数据就会丢失,为了解决这个问题,Redis提供了两种 ...
- redis 持久化RDB、AOF
1.redis持久化简介 Redis是一种高级key-value数据库.它跟memcached类似,不过数据可以持久化,而且支持的数据类型很丰富.有字符串,链表,集合和有序集合.支持在服务器端计算集合 ...
- Redis 持久化 rdb、Aof对比
一.Redis 简介: Redis是一个开源的.基于内存的数据结构存储器,可以用作数据库.缓存和消息中间件. Redis是一个key-value存储系统.和Memcached类似,它支持存储的valu ...
- redis持久化RDB和AOF
Redis 持久化: 提供了多种不同级别的持久化方式:一种是RDB,另一种是AOF. RDB 持久化可以在指定的时间间隔内生成数据集的时间点快照(point-in-time snapshot). AO ...
- redis持久化RDB与AOF
redis持久化 Redis是一种内存型数据库,一旦服务器进程退出,数据库的数据就会丢失,为了解决这个问题,Redis提供了两种持久化的方案,将内存中的数据保存到磁盘中,避免数据的丢失. RDB持久化 ...
随机推荐
- MVC5+EasyUI+EF6增删改查的演示
一.创建MVC项目 二.引入EasyUI 1.进入easyui官网下载源码 2. 将上述源码中需要的jquery 有选择的加到项目中来 添加Content文件夹,放入easyui代码 三.添加EF, ...
- 2007 NOIP T1奖学金
奖学金(07NOIPT1): [题目描述] 某小学最近得到了一笔赞助,打算拿出其中一部分为学习成绩优秀的前5名学生发奖学金.期末,每个学生都有3门课的成绩:语文.数学.英语.先按总分从高到低排序,如果 ...
- MySQL不香吗,为什么还要有noSQL?
本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是分布式专题的第14篇文章,我们一起来看看NoSQL数据库. 其实我很早就想写写分布式数据库相关的文章,既是我现在正在学习的,也是我很感 ...
- OAuth-授权机制
一.应用场景 有一个"云冲印"的网站,可以将用户储存在Google的照片,冲印出来.用户为了使用该服务,必须让"云冲印"读取自己储存在Google上的照片. 问 ...
- PyTorch中在反向传播前为什么要手动将梯度清零?
对于torch中训练时,反向传播前将梯度手动清零的理解 简单的理由是因为PyTorch默认会对梯度进行累加.至于为什么PyTorch有这样的特点,在网上找到的解释是说由于PyTorch的动态图和aut ...
- windows下部署.netcore+docker系列三 (unbuntu 18.4 下安装ftp)
// 先更新下系统sudo apt-get update//安装ftpsudo apt-get install vsftpd// 启动 服务sudo service vsftpd start//ftp ...
- python学习笔记(二)---for循环与操作列表
内容概要 for循环 range(start,end,step)函数 生成随机数列表 list()函数 将range()的结果整合到某个列表 列表的操作 切片(start: end :step) 元组 ...
- java8 流式编程
为什么需要流式操作 集合API是Java API中最重要的部分.基本上每一个java程序都离不开集合.尽管很重要,但是现有的集合处理在很多方面都无法满足需要. 一个原因是,许多其他的语言或者类库以声明 ...
- sql语句------合并结果集
select id,max(val) FROM (select id,a 列名 val from 表名unionselect id,b 列名 val from 表名unionselect id,c 列 ...
- 2018 ICPC Pacific Northwest Regional Contest I-Inversions 题解
题目链接: 2018 ICPC Pacific Northwest Regional Contest - I-Inversions 题意 给出一个长度为\(n\)的序列,其中的数字介于0-k之间,为0 ...