什么是Redis持久化?

Redis是键值对的内存数据库,它将数据存储在内存里。客户端发送命令到服务器,再由服务器到内存里查找数据。

一旦Redis服务器进程退出,存储在内存里的数据就会丢失。

为了解决这个问题,Redis提供了持久化机制,即将数据保存到磁盘里,以便Redis服务器进程初始化或重启后重新加载数据,避免数据丢失。

Redis提供两种持久化方案,分别是RDB(Redis DataBase)和AOF(Append Only File)。

RDB持久化

RDB采用快照的方式来实现持久化,把数据库数据保存到RDB文件里,也可以通过RDB文件还原数据库数据。

开启RDB持久化的方式

RBD是Redis默认的持久化方案,可以通过三种方式来生成RDB文件:SAVE、BGSAVE和自动触发,其中前两种是主动操作,后一种是被动操作,由Redis服务器控制。

SAVE

SAVE命令会阻塞Redis服务器进程,直到RDB文件创建完成,在服务器进程阻塞期间,服务器不能处理任何命令请求。

redis> Save // 等待直到RDB文件创建完成
OK

BGSAVE

和SAVE命令直接阻塞服务器进程不同,BGSAVE命令会fork一个子进程来负责创建RDB文件,服务器进程继续处理命令请求。

redis> BGSAVE // fork子进程,并由子进程创建RDB文件
Background saving started

自动触发

Redis允许用户通过设置服务器配置的save选项,让服务器每隔一段时间自动执行一次BGSAVE命令。用户可以通过save选项设置多个条件,只要满足其中任意一个条件,服务器就会执行BGSAVE命令。

save 900 1 // 服务器在900秒内,至少1次修改
save 300 10 // 服务器在300秒内,至少10次修改
save 60 10000 // 服务器在60秒内,至少10000次修改

AOF持久化

除了RDB外,Redis还提供了AOF。与RDB通过保存数据库快照不同,AOF是通过保存命令来记录数据库数据的。默认情况下,Redis是没有开启AOF的,可以通过配置redis.conf文件来开启AOF持久化,关于AOF的配置如下:

# appendonly参数开启AOF持久化
appendonly no # AOF持久化的文件名,默认是appendonly.aof
appendfilename "appendonly.aof" # AOF文件的保存位置和RDB文件的位置相同,都是通过dir参数设置的
dir ./ # 同步策略
# appendfsync always
appendfsync everysec
# appendfsync no # aof重写期间是否同步
no-appendfsync-on-rewrite no # 重写触发配置
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb # 加载aof出错如何处理
aof-load-truncated yes # 文件重写策略
aof-rewrite-incremental-fsync yes

AOF持久化实现

AOF需要记录Redis的每个命令,步骤分为:命令追加(append)、文件写入(write)和文件同步(sync)。

命令追加

当AOF持久化功能处于打开状态时,服务器在执行完一个写命令之后,会以协议格式将被执行的写命令追加到服务器状态的 aof_buf 缓冲区的末尾。

文件写入和同步

关于何时将 aof_buf 缓冲区的内容写入AOF文件中,Redis提供了三种策略:

  • appendfsync always:将aof_buf缓冲区中的所有内容写入并同步到AOF文件。
  • appendfsync everysec:将aof_buf缓冲区中的所有内容写入到AOF文件,如果上次同步AOF文件的时间距离现在超过1秒,那么两次对AOF文件进行同步,并且这个同步操作是由一个线程专门负责执行的。
  • appendfsync no:将aof_buf缓冲区中的所有内容写入到AOF文件,但并不对AOF文件进行同步,何时同步由操作系统来决定。

关于AOF的同步策略是涉及到操作系统的 write 函数和 fsync 函数的,在《Redis设计与实现》中是这样说明的:

为了提高文件写入效率,在现代操作系统中,当用户调用write函数,将一些数据写入文件时,操作系统通常会将数据暂存到一个内存缓冲区里,当缓冲区的空间被填满或超过了指定时限后,才真正将缓冲区的数据写入到磁盘里。



这样的操作虽然提高了效率,但也为数据写入带来了安全问题:如果计算机停机,内存缓冲区中的数据会丢失。为此,系统提供了fsyncfdatasync同步函数,可以强制操作系统立刻将缓冲区中的数据写入到硬盘里,从而确保写入数据的安全性。

AOF重写

AOF会记录每个Redis命令到AOF文件,随着时间越来越长,AOF文件会变得越来越大。如果不加以控制,会对Redis服务器,甚至对操作系统造成影响,而且AOF文件越大,数据恢复也越慢。

为了解决AOF文件体积膨胀的问题,Redis提供AOF文件重写功能来对AOF文件进行“瘦身”。Redis通过创建一个新的AOF文件来替换现有的AOF,新旧两个AOF文件保存的数据相同,但新AOF文件没有了冗余命令。

RDB和AOF对比

关于RDB和AOF的优缺点,官网上面也给了比较详细的说明redis.io/topics/pers…

RDB

优点:

  • RDB快照是一个压缩过的非常紧凑的文件,保存着某个时间点的数据集,适合做数据的备份,灾难恢复;
  • 可以最大化Redis的的性能,在保存RDb文件,服务器进程只需要fork一个子进程来完成RDB文件的创建,父进程不需要做IO操作;
  • 与AOF相比,恢复大数据集的时候会更快;

缺点:

  • RDB的数据安全性是不如AOF的,保存整个数据集的过程是比繁重的,根据配置可能要几分钟才快照一次,如果服务器宕机,那么就可能丢失几分钟的数据;
  • Redis数据集较大时,fork的子进程要完成快照会比较耗CPU、耗时;

AOF

优点:

  • 数据更完整,安全性更高,秒级数据丢失(取决fsync策略,如果是everysec,最多丢失1秒的数据);
  • AOF文件是一个只进行追加的日志文件,且写入操作是以Redis协议的格式保存的,内容是可读的,适合误删紧急恢复;

缺点:

  • 对于相同的数据集,AOF文件的体积要大于RDB文件,数据恢复也会比较慢;
  • 根据所使用的fsync策略,AOF的速度可能会慢于RDB。 不过在一般情况下,每秒fsync的性能依然非常高;

RDB和AOF如何选择

通常来说,应该同时使用两种持久化方案,以保证数据安全。

  • 如果数据不敏感,且可以从其他地方重新生成,可以关闭持久化。
  • 如果数据比较重要,且能够承受几分钟的数据丢失,比如缓存等,只需要使用RDB即可。
  • 如果是用做内存数据,要使用Redis的持久化,建议是RDB和AOF都开启。

当RDB与AOF两种方式都开启时,Redis会优先使用AOF恢复数据,因为AOF保存的文件比RDB文件更完整。

参考资料

Redis基础(三)Redis持久化:RDB与AOF的更多相关文章

  1. redis++:Redis的两种持久化 RDB 和 AOF

    Redis持久化备份数据的方式有两种:RDB(Redis DataBase) . AOF(Append Only  File). RDB 什么是RDB: 在指定时间间隔内,将内存中的数据集快照写入磁盘 ...

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

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

  3. Linux - redis持久化RDB与AOF

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

  4. redis持久化 RDB与AOF

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

  5. redis基础:redis下载安装与配置,redis数据类型使用,redis常用指令,jedis使用,RDB和AOF持久化

    知识点梳理 课堂讲义 课程计划 1. REDIS 入 门 (了解) (操作)   2. 数据类型 (重点) (操作) (理解) 3. 常用指令   (操作)   4. Jedis (重点) (操作) ...

  6. Redis 持久化 rdb、Aof对比

    一.Redis 简介: Redis是一个开源的.基于内存的数据结构存储器,可以用作数据库.缓存和消息中间件. Redis是一个key-value存储系统.和Memcached类似,它支持存储的valu ...

  7. 一文让你明白Redis持久化(RDB、AOF)

    为什么要持久化 Redis是内存数据库,如果不将内存中的数据库状态保存到磁盘中,那么一旦服务器进程退出,服务器的数据库状态就会消失(即断电即失).为了保证数据不丢失,我们需要将 内存中的数据存储到磁盘 ...

  8. redis持久化RDB和AOF

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

  9. Redis 持久化RDB 和AOF

    一.持久化之全量写入:RDB rdb配置 [redis@6381]$ more redis.conf save 900 1 save 300 10 save 60 10000 dbfilename & ...

  10. 进阶的Redis之数据持久化RDB与AOF

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

随机推荐

  1. kafka学习(三)kafka生产者,消费者详解

    文章更新时间:2020/06/14 一.生产者 当我们发送消息之前,先问几个问题:每条消息都是很关键且不能容忍丢失么?偶尔重复消息可以么?我们关注的是消息延迟还是写入消息的吞吐量? 举个例子,有一个信 ...

  2. Java基础一篇过(五)Map这篇就够了

    文章更新时间:2020/03/03 一.Map介绍 Map是Java的一个接口,没有继承,以Key--Value的形式来储存元素信息,常用到的有3个子类实现: HashMap 底层数据结构是散列桶(数 ...

  3. 使用maven纯注解集成ssm

    1.配置springMVC框架 第一步:导入包依赖 <!--配置springMVC--> <dependency> <groupId>javax.servlet.j ...

  4. js实现表单验证

    <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...

  5. MIT 6.S081 xv6调试不完全指北

    前言 今晚在实验室摸鱼做6.S081的Lab3 Allocator,并立下flag,改掉一个bug就拍死一只在身边飞的蚊子.在击杀8只蚊子拿到Legendary后仍然没能通过usertest,人已原地 ...

  6. C++雾中风景15:聊聊让人抓狂的Name Mangling

    Name Mangling,直接翻译过来为名字改写 .它是深入理解 C++ 编译链接模型的必由之路. 笔者近期进行数据库开发工作时,涉及到MySQL客户端的编译链接的问题,通过重新厘清了之前理解一知半 ...

  7. 《我想进大厂》之MQ夺命连环11问

    继之前的mysql夺命连环之后,我发现我这个标题被好多套用的,什么夺命zookeeper,夺命多线程一大堆,这一次,开始面试题系列MQ专题,消息队列作为日常常见的使用中间件,面试也是必问的点之一,一起 ...

  8. Android App 侧边栏菜单的简单实现

    效果图 Layout 注意事项 想要实现侧边栏,需要配合使用DrawerLayout.因为会用到嵌套布局,所以根布局不能是 ConstraintLayout,最好使用 LinearLayout 布局. ...

  9. Centos-用户管理-useradd userdel usermod groupadd groupdel id

    linux是多用户.多任务操作系统 linux角色分类 超级用户 root # 管理员.特定服务主进程 0 普通用户    $  普通管理员.服务运行需要的用户 500~65535 虚拟用户 不能登录 ...

  10. 模型集成model ensemble

    A prediction model that is composed of a set of models is called a model ensemble. Baggging 和Boostin ...