Redis持久化RDB和AOF实现原理

Stella981
• 阅读 460

Redis持久化RDB和AOF

为什么Redis需要持久化?
因为Redis属于内存型数据库,数据是储存在内存当中的,当遇到不可抗力因素,比如断电,那么储存在内存中的数据就会丢失。所以为了保证数据的完整性,我们需要做持久化操作,来保证数据的完整性。

Redis中都有哪些持久化机制?
Redis早就考虑到了这一点,所以在Redis中,为我们准备了两种持久化的机制,RDB和AOF。
既然Redis为我们提供了两种持久化的机制,那我们到底该选用哪个呢?其实啊,在Redis配置文件中RDB这种机制是默认开启的,而AOF机制是默认关闭的,也就是说如果你不进行配置,那么Redis就默认你使用了RDB这种持久化的机制。而当你开启AOF机制,那么Redis就会优先使用AOF持久化机制来进行数据的持久化操作。

下面我们来了解一下什么是RDB,什么又是AOF。

RDB(Redis Database):

RDB是Redis用来持久化的一种机制,是把当前内存中的数据集快照写进磁盘中。

上篇博客中提到过,在redis.conf配置文件中有一个叫做SNAPSHOTTING的配置模块,在里面我们可以看到有save 900 1 ,save 300 10 , save 60 10000。这里的save配置的是触发持久化操作的条件,save 900 1就是指在900秒内至少有一个key发生了改变,那么我就执行持久化操作,同理save 300 10 , save 60 10000也是指在300秒/60秒内有至少10/10000个key发生了改变就进行持久化操作。

Redis持久化RDB和AOF实现原理
当目前的数据修改达到我们配置的save条件之后,Redis就会将内存中的数据保存在dump.rdb(默认是dump.rdb,当然这个也可以在配置文件中进行更改)中。当Redis突然宕机重新启动的时候,Redis会读取dump.rdb文件中的数据加载到内存当中,很好的保证了数据的完整性。

RDB优点:

  • RDB在执行写操作时是通过从主进程里fork的子进程进行的写入的,能够很好的保证Redis的性能不会受到太大影响。
  • 和AOF机制相比,RDB是通过dump.rdb文件来进行恢复数据的,效率更佳。

RDB缺点:

  • 即使配置了save 1 1也有可能在1秒之内发生了突发事件导致服务崩溃,进而丢失那一秒钟的数据,适合对数据完整性要求不高的情况下开启此机制。

AOF(Append Only File):

Redis是默认关闭AOF机制的,他是通过记录我们操作的命令来达到数据持久化操作的目的的。
我们可以在配置文件中把他打开appendonly yes(开启AOF机制)

AOF会把我们执行的命令一条一条追加到文件中的,那么可想而知,随着命令越来越多,那么保存的文件就会越来越大,当文件达到我们配置的一个空间的时候,Redis就会通过BGREWRITEAOF命令来对AOF日志文件进行重写。

auto-aof-rewrite-percentage 100  #AOF文件大小超过上次重写时文件大小的百分之几开始重写,如果之前没有写过,则根据启动时文件大小。
auto-aof-rewrite-min-size 64mb   #允许重写的最小占用空间

同步策略可以通过以下进行配置:

appendfsync always   #当有命令执行时就同步到AOF文件中
appendfsync everysec #每隔1秒同步一次
appendfsync no       #不同步

当AOF和RDB同时开启时Redis是如何决定使用哪种机制的呢?
Redis持久化RDB和AOF实现原理
Redis启动时会读取配置文件,先去检查AOF是否开启,如果开启则加载AOF文件到内存中并启动成功,若AOF没有开启,则去加载RDB文件到内存中并启动成功。

AOF优点:

  • AOF文件通过追加的方式写入,所以不用进行内存寻址,写入效率高。
  • AOF日志文件即使过大的时候,出现后台重写操作,也不会影响客户端的读写。因为在rewritelog的时候,会对其中的指导进行压缩,创建出一份需要恢复数据的最小日志出来。再创建新日志文件的时候,老的日志文件还是照常写入。当新的merge后的日志文件ready的时候,再交换新老日志文件即可。

AOF缺点:

  • 同RDB一样,当设置AOF同步策略为everysec时,最多也是每秒执行一次同步,有可能会丢失一秒的数据,但当同步策略设置为always虽然能防止数据的丢失,同时也付出了性能的代价,二则不可兼得。
  • 对于相同的数据,AOF文件比RDB文件更占用空间。
点赞
收藏
评论区
推荐文章
Stella981 Stella981
1年前
Django 之redis的应用
redis概述 ------- `redis`是一种`nosql`数据库,他的数据是保存在内存中,同时`redis`可以定时把内存数据同步到磁盘,即可以将数据持久化,并且他比`memcached`支持更多的数据结构(`string`,`list列表[队列和栈]`,`set[集合]`,`sorted set[有序集合]`,`hash(hash表)`) ##
可莉 可莉
1年前
10分钟彻底理解Redis持久化和主从复制
在这篇文章,我们一起了解 Redis 使用中非常重要的两个机制:Reids 持久化和主从复制。 什么是 Redis 持久化? Redis 作为一个键值对内存数据库(NoSQL),数据都存储在内存当中,在处理客户端请求时,所有操作都在内存当中进行,如下所示![](https://oscimg.oschina.net/oscnet/up-4a1b1b7
Stella981 Stella981
1年前
Spring Boot 与 Kotlin 使用Redis数据库
Spring Boot中除了对常用的关系型数据库提供了优秀的自动化支持之外,对于很多NoSQL数据库一样提供了自动化配置的支持,包括:Redis, MongoDB, Elasticsearch, Solr和Cassandra。 使用Redis ------- Redis是一个开源的使用`ANSI C`语言编写、支持网络、可基于内存亦可持久化的日志型、`K
Stella981 Stella981
1年前
Redis 的落地策略
> 因为之前使用redis一般都只做热数据处理,没有考虑过落地方案,因此,通过很多次不同的交流,发现落地也挺重要的,特来学习一般。 落地策略 ==== 我们知道,redis是纯内存数据库,一旦发生宕机,数据就会丢失,因此,Redis 的落地策略其实就是持久化(Persistence),主要有以下2种策略: 1. RDB: 定时快照方式(snapsho
Stella981 Stella981
1年前
051. Redis 持久化机制
### 1\. 持久化介绍 * * * * Redis 的数据存在在内存中,如果没有配置持久化,redis 重启后数据就全丢失了,于是需要开启 redis 的持久化功能,将数据保存到磁盘上,当 redis 重启后,可以从磁盘中恢复数据。 ![image-20200511165351687](https://oscimg.oschina.net/os
Stella981 Stella981
1年前
Redis持久化的几种方式——深入解析RDB
> Redis 的读写都是在内存中,所以它的性能较高,但在内存中的数据会随着服务器的重启而丢失,为了保证数据不丢失,我们需要将内存中的数据存储到磁盘,以便 Redis 重启时能够从磁盘中恢复原有的数据,而整个过程就叫做 Redis 持久化。 ![image.png](https://oscimg.oschina.net/oscnet/232e657dae2
Stella981 Stella981
1年前
Redis 中文入门
**1) Redis** **简介** Redis 是一个开源的使用 ANSI C 语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value 数据库。 **2)** **数据类型** **2.1. Redis** **的 Key** Redis 的 key 是字符串类型,但是 key 中不能包括边界字符,由于 key 不是 binary
Stella981 Stella981
1年前
Redis数据库基础操作
MySQL和Redis的区别 -------------- """ redis: 内存数据库(读写快,IO操作少)、非关系型(操作数据方便) mysql: 硬盘数据库(数据持久化,IO操作多)、关系型(操作数据间关系) 大量访问的临时数据,才有redis数据库更优 """ redis和memca
Stella981 Stella981
1年前
Redis持久化问题定位与优化技巧
今天主要分享继Redis持久化方式RDB、AOF之后的一些常用的Redis问题定位于优化方式。 * [Redis 持久化方式-RDB](https://www.oschina.net/action/GoToLink?url=http%3A%2F%2Fmp.weixin.qq.com%2Fs%3F__biz%3DMzU3OTc1MDM1Mg%3D%3D%
Stella981 Stella981
1年前
Redis 持久化(10)
#### 持久化机制 Redis速度快,很大一部分原因是因为它所有的数据都存储在内存中。如果断电或者宕机,都会导致内存中的数据丢失。为了实现重启后数据不丢失,Redis提供了两种持久化的方案,一种是RDB快照(RedisDataBase),一种是AOF(AppendOnlyFile)。 #### RDB RDB是Redis默认的持久化方案。当满足一定条
子非鱼 子非鱼
6个月前
Redis高级
第一章 Redis的持久化由于redis是一个内存数据库,所有的数据都是保存在内存当中的,内存当中的数据极易丢失,所以redis的数据持久化就显得尤为重要,在redis当中,提供了两种数据持久化的方式,分别为RDB以及AOF,且Redis默认开启的数据持久化方式为RDB方式。 1、RDB持久化方案Redis会定期保存数据快照至一个rbd文件中,并在启动时自动