Redis的两种持久化机制(RDB和AOF)

什么是持久化

   Redis的数据是存储在内存中的,内存中的数据随着服务器的重启或者宕机便会不复存在,在生产环境,服务器宕机更是屡见不鲜,所以,我们希望Redis能够将数据从内存中以某种形式保存到磁盘中,使得重启的时候可以加载磁盘中的文件记录恢复数据,这一过程便是Redis的持久化。
   Redis支持两种持久化机制,一种是RDB,另一种是AOF。Redis默认情况下使用RDB方式进行持久化。两种持久化可以单独使用其中的一种,也可以二者结合使用,下面便来分别介绍下这两种持久化机制。

RDB方式

   RDB方式的持久化是通过快照(snapshotting)方式完成的,当符合一定条件的时候redis会自动将内存中的数据生成一份副本存储在磁盘中,这个过程即为“快照”。
Redis会根据以下几种情况对数据进行快照:

  • 根据配置规则自动进行快照
  • 用户执行SAVE或者BGSAVE命令;
  • 执行FLUSHALL命令;
  • 执行复制时;

1)根据规则自定义快照条件

用户可以自定义快照条件,当符合快照条件,Redis便会执行快照操作,在redis.conf配置文件中,有这么一段配置及说明:

It is also possible to remove all the previously configured save
#   points by adding a save directive with a single empty string argument
#   like in the following example:
#
#   save ""

save 900 1
save 300 10
save 60 10000

# By default Redis will stop accepting writes if RDB snapshots are enabled
# (at least one save point) and the latest background save failed.
# This will make the user aware (in a hard way) that data is not persisting
# on disk properly, otherwise chances are that no one will notice and some
# disaster will happen.

在save命令后面加上两个数字,save 。例如:save 900 1 表示在900秒内有一个或者一个以上的键被更改时即执行快照操作。

2)执行SAVE或者BGSAVE命令

1、save命令
   执行save命令时redis会同步执行快照操作,这将会阻塞所有来自客户端的请求,服务器无法响应其他的处理,直到执行完成为止。如果数据量小,用此命令可能感觉不出有什么区别,但是当数据量很大的时候,就需要谨慎使用这个命令。
2、bgasve命令
执行bgsave命令时,redis会fork出一个子进程去完成备份的操作,不会影响redis处理其他的请求。

3)执行FLUSHALL命令

   执行FLUSHALL命令时,Redis会清除数据库中的所有数据,不论清空数据库的过程是否触发了自动快照条件,只要快照条件存在,就会执行快照操作,当没有快照条件时,执行FLUSHALL不会进行快照。

4)执行复制时

当设置了主从模式时,Redis会在复制初始化时进行自动快照,即使没有设置自动快照条件时,也会执行快照操作。

存储路径:
   Redis默认将快照文件保存在Redis当前进程的工作目录中的dump.rdb文件中,可以通过配置dir和dbfilename两个参数分别制定快照文案件的存储路径和文件名。如redis.conf文件中的配置和注释:

# The filename where to dump the DB
dbfilename dump.rdb

# The working directory.
# DB将以dbfilename指定文件名被写入这个目录中,
# The DB will be written inside this directory, with the filename specified
# above using the 'dbfilename' configuration directive.
# Note that you must specify a directory here, not a file name.
dir ./

执行快照的过程

  1. Redis使用fork函数复制一份当前进程(父进程)的副本(子进程);
  2. 父进程继续接受来自客户端的请求,子进程开始将内存中的数据写入到硬盘中的临时文件;
  3. 当子进程写入完之后会用该临时文件替换旧的rdb文件。

   redis在执行快照的过程中不会修改RDB文件,在快照结束后才会进行替换。因此RDB文件通常也用来实现Redis的数据备份,并且RDB文件是经过压缩的二进制格式,所以占用空间比内存中的数据小。

   Redis启动后会读取RDB文件,将数据从磁盘加载到内存,通常将一个记录了1000万字符串类型键、大小为1GB的快照文件载入内存需要20~30秒,载入的时间根据不同的服务器性能和Redis的数据结构而不同。

RDB 的优缺点
优点:
1 适合大规模的数据恢复。
2 如果业务对数据完整性和一致性要求不高,RDB是很好的选择。

缺点:
1 数据的完整性和一致性不高,因为RDB可能在最后一次备份时宕机了。
2 备份时占用内存,因为Redis 在备份时会独立创建一个子进程,将数据写入到一个临时文件(此时内存中的数据是原来的两倍哦),最后再将临时文件替换之前的备份文件。


AOF方式

   为了降低因为进程终止导致的数据丢失的风险,Redis还提供了AOF的方式来进行持久化,AOF可以将Redis执行的每一条命令追加到硬盘文件中,这一过程会降低redis的性能,但从数据的安全性来说,这个影响是可以接受的。

AOF文件的保存地址和RDB文件位置相同,都是通过dir参数设置,默认文件名为appendonly.aof。
如下所示:

appendonly no

# The name of the append only file (default: "appendonly.aof")

appendfilename "appendonly.aof"

默认情况下,Redis没有开启AOF的方式,可通过修改redis.conf配置文件中的appendonly参数为yes进行启动。

如果还没有生成aof文件的话,可以使用命令设置:

./redis-cli config set appendonly yes

aof文件打开是这样的:

*2
$6
SELECT
$1
0
*3
$3
SET
$3
age
$2
28
*3
$3
SET
$2
cc
$2
vv

   AOF文件以纯文本的形式记录了Redis的执行命令,AOF文件中的内容是Redis客户端向Redis发送的原始通信协议的内容,当对相同key进行多次赋值操作时,aof也会将这些命令记录下来,但其实我们只希望它记录最后一次的值,为此Redis在redis.conf文件中提供了这样的参数来自动重写AOF文件:

# 当目前的AOF文件大小超过上一次重写的AOF文件大小的百分之多少进行重写
auto-aof-rewrite-percentage 100
# 允许重写的AOF的最小AOF文件大小
auto-aof-rewrite-min-size 64mb

Redis在启动的时候会逐条执行AOF文件中的命令来将硬盘中的文件写入到内存中,因此载入的速度相对慢些。


# The fsync() call tells the Operating System to actually write data on disk
# instead of waiting for more data in the output buffer. Some OS will really flush
# data on disk, some other OS will just try to do it ASAP.
#
# Redis supports three different modes:
#
# no: don't fsync, just let the OS flush the data when it wants. Faster.
# always: fsync after every write to the append only log. Slow, Safest.
# everysec: fsync only one time every second. Compromise.
# The default is "everysec", as that's usually the right compromise between
# speed and data safety. It's up to you to understand if you can relax this to
# "no" that will let the operating system flush the output buffer when
# it wants, for better performances (but if you can live with the idea of
# some data loss consider the default persistence mode that's snapshotting),
# or on the contrary, use "always" that's very slow but a bit safer than
# everysec.
#
# More details please check the following article:
# http://antirez.com/post/redis-persistence-demystified.html
#
# If unsure, use "everysec".

# appendfsync always
appendfsync everysec
# appendfsync no

并且我们需要注意的是下面这段描述:

The fsync() call tells the Operating System to actually write data on disk
# instead of waiting for more data in the output buffer. Some OS will really flush
# data on disk, some other OS will just try to do it ASAP.

   虽然每次更改数据库内容的操作时,redis都会把更新记录在AOF文件中,但是由于操作系统的缓存机制,数据并没有真正的写入磁盘,而是进入了系统硬盘缓存。在默认情况下会每30秒执行一次同步操作,如果在这30秒之内系统异常会导致硬盘缓存中的数据丢失,我们使用AOF命令的方式就是为了尽可能的减少数据的丢失,所以redis提供了appendfsync参数来设置同步机制。默认情况下使用everysec,即每秒执行一次同步操作,将数据从缓存更新到磁盘中。always表示每次执行写入都会执行同步操作,这是最慢也是最安全的方式。no表示不主动执行,交由操作系统执行,这是最不安全的方式。一般情况下兼顾系统性能,使用everysec的方式即可。

优点:数据的完整性和一致性更高
缺点:因为AOF记录的内容多,文件会越来越大,数据恢复也会越来越慢。

   RDB和AOF可以同时存在,这样既保证了数据安全又使得进行备份操作十分容易,Redis会使用AOF文件来恢复数据,因为AOF的方式持久化丢失的数据会更少。

参考书籍:《Redis入门指南》

Redis系列之----Redis的两种持久化机制(RDB和AOF)的更多相关文章

  1. 详解Redis中两种持久化机制RDB和AOF(面试常问,工作常用)

    redis是一个内存数据库,数据保存在内存中,但是我们都知道内存的数据变化是很快的,也容易发生丢失.幸好Redis还为我们提供了持久化的机制,分别是RDB(Redis DataBase)和AOF(Ap ...

  2. 详解Redis中两种持久化机制RDB和AOF

    redis是一个内存数据库,数据保存在内存中,但是我们都知道内存的数据变化是很快的,也容易发生丢失.幸好Redis还为我们提供了持久化的机制,分别是RDB(Redis DataBase)和AOF(Ap ...

  3. redis缓存架构-02-两种持久化机制(RDB和AOF)

    1.两种持久化机制的介绍 1.1 RDB 周期性的生成redis内存数据的一份完整的快照 1)根据配置的检查点,生产rdb快照文件,fork一个子线程,将数据dump到rdb快照文件中,完成rdb文件 ...

  4. redis两种持久化方式RDB和AOF

    目录 前言 1. Redis 数据库结构 2. RDB 持久化 2.1. RDB 的创建和载入 2.1.1. 手动触发保存 SAVE 命令 BGSAVE 命令 SAVE 和 BGSAVE 的比较 2. ...

  5. 9. 图解分析Redis的RDB和AOF两种持久化机制的原理

    1.RDB和AOF两种持久化机制的介绍 2.RDB持久化机制的优点3.RDB持久化机制的缺点4.AOF持久化机制的优点5.AOF持久化机制的缺点6.RDB和AOF到底该如何选择 我们已经知道对于一个企 ...

  6. 10.Redis的RDB和AOF两种持久化机制的优劣势对比

    1.RDB和AOF两种持久化机制的介绍 2.RDB持久化机制的优点3.RDB持久化机制的缺点4.AOF持久化机制的优点5.AOF持久化机制的缺点6.RDB和AOF到底该如何选择 我们已经知道对于一个企 ...

  7. Redis学习一:Redis两种持久化机制

    申明 本文章首发自本人公众号:壹枝花算不算浪漫,如若转载请标明来源! 感兴趣的小伙伴可关注个人公众号:壹枝花算不算浪漫 22.jpg 前言 Redis是基于内存来实现的NO SQL数据库,但是我么你都 ...

  8. redis的RDB和AOF两种持久化机制

    思维导图:我的redis基础知识汇总 RDB持久化机制的优点 (1)RDB会生成多个数据文件,每个数据文件都代表了某一个时刻中redis的数据,这种多个数据文件的方式,非常适合做冷备,可以将这种完整的 ...

  9. 分析RedisRDB和AOF两种持久化机制的工作原理及优劣势

    一.RDB和AOF两种持久化机制的介绍 RDB持久化机制,对redis中的数据执行周期性的持久化 AOF机制对每条写入命令作为日志,以append-only(追加)的模式写入一个日志文件中,在redi ...

随机推荐

  1. java方法特点

    它可以实现独立的功能; 必须定义在类里面; 它只有被调用才会执行; 它可以被重复使用; 方法结束后方法里的对象失去引用; 如何定义一个功能,并通过方法体现出来: ① 明确该功能运算后的结果.明确返回值 ...

  2. springboot + rabbitmq发送邮件(保证消息100%投递成功并被消费)

    前言: RabbitMQ相关知识请参考: https://www.jianshu.com/p/cc3d2017e7b3 Linux安装RabbitMQ请参考: https://www.jianshu. ...

  3. 陈志生:德国信贷工厂风控模式对P2P的启发

    上海合盘金融信息服务股份有限公司董事长陈志生 和讯银行消息 "2014中国金融论坛"于5月14-15日在北京召开,本次论坛主题为“全面深化金融体制改革与实体经济增长”.和讯网作为指 ...

  4. vue基于 element-ui 实现菜单动画效果,任意添加 li 个数均匀撑满 ul 宽度

    %)%)%%%))) .) .) .) .) .) .) .) .) .) .) .) .) .) .) .) .% %% %deg);}

  5. H3C 域名

  6. linux一个例子驱动

    我们介绍的驱动称为 short (Simple Hardware Operations and Raw Tests). 所有它做 的是读和写几个 8-位 端口, 从你在加载时选择的开始. 缺省地, 它 ...

  7. Linux 内核类设备

    一个类的真正目的是作为一个是该类成员的设备的容器. 一个成员由 struct class_device 来表示: struct class_device { struct kobject kobj; ...

  8. CodeForces Goodbye 2017

    传送门 A - New Year and Counting Cards •题意 有n张牌,正面有字母,反面有数字 其中元音字母$a,e,o,i,u$的另一面必须对应$0,2,4,6,8$的偶数 其他字 ...

  9. 2018-11-13-WPF-禁用实时触摸

    title author date CreateTime categories WPF 禁用实时触摸 lindexi 2018-11-13 10:45:37 +0800 2018-5-4 21:0:3 ...

  10. 如何用python“优雅的”调用有道翻译?

    前言 其实在以前就盯上有道翻译了的,但是由于时间问题一直没有研究(我的骚操作还在后面,记得关注),本文主要讲解如何用python调用有道翻译,讲解这个爬虫与有道翻译的js“斗争”的过程! 当然,本文仅 ...