大家都知道,Redis之所以性能好,读写快,是因为Redis是一个内存数据库,它的操作都几乎基于内存。但是内存型数据库有一个很大的弊端,就是当数据库进程崩溃或系统重启的时候,如果内存数据不保存的话,里面的数据就会丢失不见了。这样的数据库并不是一个可靠的数据库。

所以数据的持久化是内存型数据库的重中之重。它不仅提供数据保存硬盘的功能,还可以借此用硬盘容量扩展数据存储空间,使得Redis的可以存储超过机器本身内存大小的数据。

Redis对于数据持久化提供了两种持久化的方案,RDB与AOF。它们的原理和使用场景都大不相同,下面我们来详细地了解下。

RDB——数据快照(Snapshot)

RDB,提供一个某个时间点的数据的Snapshot,保存在RDB文件中。它可以通过SAVE/BGSAVE命令手动执行,把数据Snapshot写到RDB文件,也可以通过配置,定时执行。

Redis也可以通过加载RDB文件,把数据从磁盘加载读取到Redis中。

RDB文件创建

连上Redis,设值一些值,然后执行SAVE命令。

然后可以查看下redis.conf的持久化工作目录。进入目录可以看到保存了一个dump.rdb文件。该文件是一个二进制文件,无法直接正常打开。

至于SAVE/BGSAVE的区别,就是前置是阻塞执行,此时服务不会接受请求,后者是Fork一个子进程出来,由该进程去执行保存RDB文件的操作,不影响用户请求。

P.S. Redis是单进程的,所以BGSAVE只能Fork一个子进程,而不是创建一个线程处理。

以上是手动执行的过程。但在生产我们很少会手动登上服务去执行操作,所以更多的时候是依赖Redis的配置,定时保存RDB文件。

打开redis.conf配置文件,找到SNAPSHOTTING的配置,Save Point的设置。

图中的配置意思是,当至少有一个key变更时,900秒后会执行一次SAVE。其他配置同理,有10次变更,300秒后保存一次.....

在Redis中,这个自动保存RDB的功能是默认开启的。

RDB文件加载

先kill掉Redis进程,再重新启动Redis Server,会发现日志会有这样的一行,

并且Redis中,依然有之前设置的三个值。说明Redis在启动的时候,会加载数据初始化。

不过,这里加载的初始化数据不一定是RDB的。如果Redis开启了AOF,会优先从AOF初始化数据,否则才会加载RDB的数据。

RDB优缺点

优点:

  1. RDB是某一时间点的快照,是一个紧凑的单文件,更多用于数据备份。可以按每小时或每日来备份,方便从不同的版本恢复数据。
  2. 单文件容易传输到远程服务做故障恢复。
  3. RDB可以Fork子进程进行持久化,使Redis可以更好地处理用户请求
  4. 在大量数据的情况下,RDB相比较于AOF会更快的加载。

缺点:

  1. 如果Redis不及时保存RDB文件,会造成数据的丢失。例如系统突然断电,但未来得及保存数据。即使你设置更多的Save point,也无法保证100%的数据不丢失。
  2. RDB经常需要fork子进程去执行,但如果再大量数据的情况下,这个fork操作会非常耗CPU资源的。对比AOF虽然也是fork,但是它的数据保存处理是可以控制的,不需要全量保存。

AOF——日志追加(Append-Only)

Redis的另外一种持久化方案就是AOF,Append Only File。AOF相当于一个操作的日志记录,每次对于数据的变更都会记录追加到AOF日志。当服务启动的时候就会读这些操作日志,重新执行一次操作,从而恢复原始数据。

AOF启用

AOF默认是关闭的。打开redis.conf配置文件,找到appendonly no改成appendonly yes

AOF和RDB是可以共存的,只要保存的文件名不冲突。

AOF fsync同步规则

配置文件往下拉,看到fsync的配置。

fsync()是一个系统调用函数,告诉操作系统把数据写到硬盘上,而不是缓存更多数据才写到硬盘。这样的调用可以及时保存数据到硬盘上。

Redis提供了三种fsync的调用方式

  • appendfsync always,每次操作记录都同步到硬盘上,最低效,最安全。
  • appendfsync everysec,每秒执行一次把操作记录同步到硬盘上。默认选项。
  • appendfsync no,不执行fysnc调用,让操作系统自动操作把缓存数据写到硬盘上,不可靠,但最快。

AOF文件格式解析

开启AOF后,会再工作目录看到appendonly.aof文件。

在客户端上执行一些命令后,打开AOF文件,可以观察到有对应的操作的记录日志。

文件解析说明:

  • *,表示命令的参数个数,例如set a 1是三个参数,所以是*3
  • $,表示参数的字节数,例如set这个参数是三字节,所以是$3,key值a是一个字节,所以是$1
  • 无符号,表示是参数的数据,例如set,a,1就是具体的数据

日志重写

AOF虽然比RDB更可靠,但缺点也是比较明显的,就是每次写操作都要把操作日志写到文件上,这样会导致文件非常冗余。

假若你要自增一个计数器100次,如果不重写,AOF文件就就会有这100次的自增记录,如INCR a。如果执行了日志重写,那么文件只会保留set a 100而不是100条INCR a。这样拥有相同的结果,但可以大大减少AOF的文件大小,并且可以让AOF载入的时候提升载入的效率。

看回redis.conf配置,有两项控制rewrite的选项。

  • auto-aof-rewrite-percentage 100,当文件增长100%(一倍)时候,自动重写。
  • auto-aof-rewrite-min-size 64mb,日志重写最小文件大小,如果小于该大小,不会自动重写。

来实验一下重写的结果,我们先设定一个a值,然后自增多次,查看AOF文件内容。里面有很多INCR的语句记录

然后我们手动执行下BGREWRITEOF,执行日志重写。

可以看到,多个incr语句,变成了一个set a 6语句,减少了5个incr a语句的操作日志。

AOF优缺点

优点:

  1. AOF可以设置 完全不同步、每秒同步、每次操作同,默认是每秒同步。因为AOF是操作指令的追加,所以可以频繁的大量的同步。
  2. AOF文件是一个值追加日志的文件,即使服务宕机为写入完整的命令,也可以通过redis-check-aof工具修复这些问题。
  3. 如果AOF文件过大,Redis会在后台自动地重写AOF文件。重写后会使AOF文件压缩到最小所需的指令集。
  4. AOF文件是有序保存数据库的所有写入操作,易读,易分析。即使如果不小心误操作数据库,也很容易找出错误指令,恢复到某个数据节点。例如不小心FLUSHALL,可以非常容易恢复到执行命令之前。

缺点

  1. 相同数据量下,AOF的文件通常体积会比RDB大。因为AOF是存指令的,而RDB是所有指令的结果快照。但AOF在日志重写后会压缩一些空间。
  2. 在大量写入和载入的时候,AOF的效率会比RDB低。因为大量写入,AOF会执行更多的保存命令,载入的时候也需要大量的重执行命令来得到最后的结果。RDB对此更有优势。

如何选择

以上已经基本了解过RDB和AOF的使用、基本原理以及对应的优缺点。那么在实际当中,我们到底怎么去选择用哪种持久化方式呢?

一般来说,不考虑硬盘大小,最安全的做法是RDB与AOF同时使用,即使AOF损坏无法修复,还可以用RDB来恢复数据。

如果Redis的数据在你的服务中并不是必要的数据,例如只是当简单的缓存,没有缓存也不会造成缓存雪崩。说明数据的安全可靠性并不是首要考虑范围内,那么单独只使用RDB就可以了。

不推荐单独使用AOF,因为AOF对于数据的恢复载入来说,比RDB慢。并且Redis官方也说明了,AOF有一个罕见的bug。出了问题无法很好的解决。所以使用AOF的时候,最好还是有RDB作为数据备份。


根据官方的意愿描述,在未来可能会有一种RDB与AOF相结合的持久化模型。到时Redis持久化就不再如此麻烦费劲了,我们拭目以待吧。


更多技术文章、精彩干货,请关注
博客:zackku.com
微信公众号:Zack说码

进阶的Redis之数据持久化RDB与AOF的更多相关文章

  1. Redis之数据持久化RDB与AOF

    Redis之数据持久化RDB与AOF https://www.cnblogs.com/zackku/p/10087701.html 大家都知道,Redis之所以性能好,读写快,是因为Redis是一个内 ...

  2. redis学习之——持久化RDB 和AOF

    RDB: 在指定的时间间隔内将内存中的数据集快照写入磁盘, 也就是行话讲的Snapshot快照,它恢复时是将快照文件直接读到内存里.rdb 保存的是dump.rdb文件 RDB工作原理: Redis会 ...

  3. Redis的快照持久化-RDB与AOF

    Redis持久化功能 Redis为了内部数据的安全考虑,会把本身的数据以文件形式保存到硬盘中一份,在服务器重启之后会自动把硬盘的数据恢复到内存(redis)的里边. 数据保存到硬盘的过程就称为“持久化 ...

  4. Redis数据持久化—RDB持久化与AOF持久化

    目录 Redis数据持久化-RDB持久化与AOF持久化 RDB持久化 RDB文件的创建 RDB文件的载入 自动间隔性保存 检查保存条件是否满足 AOF持久化 AOF持久化的实现 AOF文件的载入与数据 ...

  5. Redis持久化RDB和AOF优缺点是什么,怎么实现的?我应该用哪一个?

    原文http://www.ymq.io/2018/03/24/redis/ Redis是一种高级key-value数据库.数据可以持久化,而且支持的数据类型很丰富.有字符串,链表,集 合和有序集合.支 ...

  6. Linux - redis持久化RDB与AOF

    目录 Linux - redis持久化RDB与AOF RDB持久化 redis持久化之AOF redis不重启,切换RDB备份到AOF备份 确保redis版本在2.2以上 实验环境准备 备份这个rdb ...

  7. redis配置数据持久化---APPEND ONLY MODE

    Redis配置数据持久化---APPEND ONLY MODE 2016年04月01日 19:05:11 阅读数:9918 Redis可以实现数据的持久化存储,即将数据保存到磁盘上. Redis的持久 ...

  8. redis持久化 RDB与AOF

    redis持久化 RDB与AOF RDB与AOF区别 rdb: 基于快照的持久化,速度更快,一般用做备份,主从复制也是依赖于rdb持久化功能 aof:以追加的方式记录redis操作日志的文件,可以最大 ...

  9. redis持久化RDB和AOF

    Redis 持久化: 提供了多种不同级别的持久化方式:一种是RDB,另一种是AOF. RDB 持久化可以在指定的时间间隔内生成数据集的时间点快照(point-in-time snapshot). AO ...

随机推荐

  1. android ui界面设计参数讲解

    百度文库: http://wenku.baidu.com/link?url=s66Hw6byBEzmjL77doYL1YQN4Y_39F7MovaHKs5mVGrzTDOQCAmiM-1N_6Cdm- ...

  2. Java的 final 关键字

    本文主要探讨Java final 关键字修饰变量时的用法. !!!!文末有彩蛋!!!! 1.修饰类 当用final修饰一个类时,表明这个类不能被继承.也就是说,如果一个类你永远不会让他被继承,就可以用 ...

  3. 搞懂分布式技术21:浅谈分布式消息技术 Kafka

    搞懂分布式技术21:浅谈分布式消息技术 Kafka 浅谈分布式消息技术 Kafka 本文主要介绍了这几部分内容: 1基本介绍和架构概览 2kafka事务传输的特点 3kafka的消息存储格式:topi ...

  4. 十三 web爬虫讲解2—Scrapy框架爬虫—Scrapy爬取百度新闻,爬取Ajax动态生成的信息

    crapy爬取百度新闻,爬取Ajax动态生成的信息,抓取百度新闻首页的新闻rul地址 有多网站,当你浏览器访问时看到的信息,在html源文件里却找不到,由得信息还是滚动条滚动到对应的位置后才显示信息, ...

  5. IOS-APP前需要考虑的几件事

    做一个 App 前需要考虑的几件事 来源:Limboy's HQ 链接:http://t.cn/R5sEDMJ 随着工具链的完善,语言的升级以及各种优质教程的涌现,做一个 App 的成本也越来越低了. ...

  6. 【lightoj-1024】Eid (高精度)

    [题意] 给定n个数,求这n个数的最小公倍数. [题解] 最小公倍数当然不能按常规方法来求,因为最大的数将近是10000^1000级别的.然鹅最小公倍数怎么搞呢? 这里发现了一个规律: 4 5 6 3 ...

  7. Visual Studio 2017再现C语言经典例题(一)

    1.编写一个程序,输入a.b.c这3个值,输出其中最大者. 2.将“China”译成密码.密码规律:用原来的字母后面第4个字母代替原来的字母.例如,字母A后面第4个字母是E,用E代替A,因此,Chin ...

  8. LeetCode OJ:Convert Sorted List to Binary Search Tree(将排序好的链表转换成二叉搜索树)

    Given a singly linked list where elements are sorted in ascending order, convert it to a height bala ...

  9. python 中 property 属性的讲解及应用

    Python中property属性的功能是:property属性内部进行一系列的逻辑计算,最终将计算结果返回 property属性的有两种方式: 1. 装饰器 即:在方法上应用装饰器 2. 类属性 即 ...

  10. New Concept English there (5)

    25w/m Editors of newspapers and magazines often go to extremes to provide their readers with unimpor ...