Redis持久化RDB和AOF实现原理

Stella981
• 阅读 823

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文件更占用空间。
点赞
收藏
评论区
推荐文章
可莉 可莉
3年前
10分钟彻底理解Redis持久化和主从复制
在这篇文章,我们一起了解Redis使用中非常重要的两个机制:Reids持久化和主从复制。什么是Redis持久化?Redis作为一个键值对内存数据库(NoSQL),数据都存储在内存当中,在处理客户端请求时,所有操作都在内存当中进行,如下所示!(https://oscimg.oschina.net/oscnet/up4a1b1b7
Stella981 Stella981
3年前
NoSQL数据库Redis和MongoDB
redis简介一些特点:Redis的读写性能极高,并且有丰富的特性(发布/订阅、事务、通知等)。Redis支持数据的持久化(RDB和AOF两种方式),可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。Redis支持多种数据类型,包括:string、hash、list、set,zset、bitm
可莉 可莉
3年前
051. Redis 持久化机制
1\.持久化介绍Redis的数据存在在内存中,如果没有配置持久化,redis重启后数据就全丢失了,于是需要开启redis的持久化功能,将数据保存到磁盘上,当redis重启后,可以从磁盘中恢复数据。!image20200511165351687(https://oscimg.oschina.net/os
Stella981 Stella981
3年前
051. Redis 持久化机制
1\.持久化介绍Redis的数据存在在内存中,如果没有配置持久化,redis重启后数据就全丢失了,于是需要开启redis的持久化功能,将数据保存到磁盘上,当redis重启后,可以从磁盘中恢复数据。!image20200511165351687(https://oscimg.oschina.net/os
Stella981 Stella981
3年前
Redis——持久化数据
Redis被称为是内存数据库,那是因为它会将其所有数据存储在内存里,因此Redis具有强劲的速度性能,但是,也正因为数据存储在内存中,当Redis重启后,所有存储在内存的数据就会丢失。为了使得数据持久化,Redis提供了两种方式:RDB方式和AOF方式。一、RDB方式RDB方式的持久化是通过快照(snapshotting)完成的,
Stella981 Stella981
3年前
Redis—持久化
一、持久化简介Redis的数据全部存储在内存中,如果突然宕机,数据就会全部丢失,因此必须有一套机制来保证Redis的数据不会因为故障而丢失,这种机制就是Redis的持久化机制,它会将内存中的数据库状态保存到磁盘中。持久化发生了什么|从内存到磁盘
Stella981 Stella981
3年前
Redis 持久化(10)
持久化机制Redis速度快,很大一部分原因是因为它所有的数据都存储在内存中。如果断电或者宕机,都会导致内存中的数据丢失。为了实现重启后数据不丢失,Redis提供了两种持久化的方案,一种是RDB快照(RedisDataBase),一种是AOF(AppendOnlyFile)。RDBRDB是Redis默认的持久化方案。当满足一定条
Stella981 Stella981
3年前
Redis持久化存储详解(一)
为什么要做持久化存储?持久化存储是将Redis存储在内存中的数据存储在硬盘中,实现数据的永久保存。我们都知道Redis是一个基于内存的nosql数据库,内存存储很容易造成数据的丢失,因为当服务器关机等一些异常情况都会导致存储在内存中的数据丢失。持久化存储分类在Redis中,持久化存储分为两种。一种是aof日志追加的方式
Stella981 Stella981
3年前
Redis几个问题总结
redis持久化策略redis是一个内存数据库,但是它提供了持久化机制。即把数据永久的存储在磁盘上。我们来看看这个redis保存数据的流程(1)客户端向服务端发送写操作(数据在客户端的内存中)。(2)数据库服务端接收到写请求的数据(数据在服务端的内存中)。(3)服务端调用write这个系统调用,将数据往磁盘上写(数据在系
子非鱼 子非鱼
2年前
Redis高级
第一章Redis的持久化由于redis是一个内存数据库,所有的数据都是保存在内存当中的,内存当中的数据极易丢失,所以redis的数据持久化就显得尤为重要,在redis当中,提供了两种数据持久化的方式,分别为RDB以及AOF,且Redis默认开启的数据持久化方式为RDB方式。1、RDB持久化方案Redis会定期保存数据快照至一个rbd文件中,并在启动时自动