Redis 持久化机制(快照、AOF)

  • 快照 (Snapshot)
    • 1. 客户端方式之 BGSAVE(多线程执行)
    • 2. 客户端方式之 SAVE(单线程执行)
    • 3. 服务器配置方式之 配置快照触发条件
    • 4. 服务器接收客户端 SHUTDOWN 指令
    • 配置文件中配置生成快照名称和位置
  • 只追加日志文件 AOF (Append Only File)
    • 1.always【谨慎使用】
    • 2.everysec【推荐】
    • 3.no【不推荐】
    • 配置文件中修改同步频率
  • AOF文件重写机制
    • AOF带来的问题
    • 1. 客户端方式 触发重写
    • 2. 服务器配置方式 自动触发
    • 重写原理
  • Redis 持久化总结

Redis 是 内存数据库,但是它也能够将存储的数据保存在硬盘上,这是由于它的持久化机制。

Redis 官方提供了两种不同的持久化方法来将数据存储到硬盘里面分别是:

  • 快照 (Snapshot)
  • AOF (Append Only File) 只追加日志文件

快照 (Snapshot)

这种方式可以将某一时刻的所有数据都写入硬盘中,这也是Redis 的默认开启持久化方式,保存的文件是以 .rdb 形式结尾的文件,因此这种方式也称之为 RDB方式。

快照生成方式:

  • 客户端方式:BGSAVESAVE 指令
  • 服务器配置自动触发
  • 服务器 SHUTDOWN 自动触发

1. 客户端方式之 BGSAVE(多线程执行)

客户端可以使用 BGSAVE 命令来创建一个快照,当接收到客户端的 BGSAVE 命令时,Redis 会调用 fork 来创建一个子进程,然后子进程负责将快照写入磁盘中,而父进程则继续处理命令请求。

fork:当一个进程创建子进程的时候,底层的操作系统会创建该进程的一个副本,在类unix系统中创建子进程的操作会进行优化:在刚开始的时候,父子进程共享相同内存,直到父进程或子进程对内存进行了写之后,对被写入的内存的共享才会结束服务。

2. 客户端方式之 SAVE(单线程执行)

客户端还可以使用 SAVE 命令来创建一个快照,接收到 SAVE 命令的 Redis服务器在快照创建完毕之前将不再响应任何其他的命令;

注意:SAVE 命令并不常用,使用 SAVE 命令在快照创建完毕之前,Redis处于阻塞状态,无法对外服务。

3. 服务器配置方式之 配置快照触发条件

如果用户在 redis.conf 中设置了 save 配置选项,Redis 会在 save 选项条件满足之后自动触发一次 BGSAVE 命令;如果设置多个 save 配置选项,当任意一个 save 配置选项条件满足,Redis 也会触发一次 BGSAVE 命令。

save 900 1 表示 900s 内,执行了 1次 数据库操作则自动创建快照,以此类推。

4. 服务器接收客户端 SHUTDOWN 指令

当 Redis 通过 SHUTDOWN 指令接收到关闭服务器的请求时,会执行一个 SAVE 命令,阻塞所有的客户端,不再执行客户端执行发送的任何命令,并且在 SAVE 命令执行完毕之后关闭服务器。

配置文件中配置生成快照名称和位置

配置文件中可以修改生成快照名称以及快照保存位置:

# 生成快照名字, 默认为 dump.rdb
dbfilename dump.rdb# 快照保存位置, 默认保存在 redis-cli 同级目录
dir ./

只追加日志文件 AOF (Append Only File)

在 Redis 的默认配置中 AOF持久化机制是没有开启的,需要在配置中开启;

# 开启 AOF持久化
appendonly yes# 生成的日志文件名称
appendfilename "appendonly.aof"# aof日志文件路径与快照保存位置设置的是同一个
dir ./


AOF 有 3 种 日志追加频率:

  • always 【谨慎使用】
  • everysec 【推荐】
  • no【不推荐】

1.always【谨慎使用】

  • 说明:每个 redis写命令 都要同步写入硬盘,严重降低 redis 速度;
  • 解释:如果用户使用了 always 选项,那么每个 redis 写命令都会被写入硬盘,从而将发生系统崩溃时出现的数据丢失减到最少;遗憾的是,因为这种同步策略需要对硬盘进行大量的写入操作,所以 redis 处理命令的速度会受到硬盘性能的限制;
  • 注意:转盘式硬盘(机械硬盘)在这种频率下200左右个命令/s;固态硬盘(SSD) 几百万个命令/s;
  • 警告:使用SSD用户请谨慎使用 always 选项,这种模式不断写入少量数据的做法有可能会引发严重的 写入放大 问题,导致将固态硬盘的寿命从原来的几年降低为几个月。

2.everysec【推荐】

  • 说明:每秒 执行一次同步显式的将多个写命令同步到磁盘;
  • 解释:为了兼顾数据安全和写入性能,可以使用 everysec 选项,让 redis 每秒一次的频率对AOF文件进行同步;redis 每秒同步一次AOF文件时性能和不使用任何持久化特性时的性能相差无几,而通过每秒同步一次AOF文件,redis可以保证,即使系统崩溃,用户最多丢失一秒之内产生的数据。

3.no【不推荐】

  • 说明:由操作系统决定何时同步;
  • 解释:使用 no 选项,将完全有操作系统决定什么时候同步AOF日志文件,这个选项不会对 redis 性能带来影响,但是系统崩溃时,会丢失不定数量的数据,另外如果用户硬盘处理写入操作不够快的话,当缓冲区被等待写入硬盘数据填满时,redis 会处于阻塞状态,并导致 redis 的处理命令请求的速度变慢。

配置文件中修改同步频率

# appendfsync always
appendfsync everysec
# appendfsync no

AOF文件重写机制

AOF带来的问题

AOF的方式也同时带来了另一个问题:持久化文件会变的越来越大。

例如我们调用 incr test 命令 100 次,文件中必须保存全部的 100 条命令,其实有 99 条都是多余的,因为要恢复数据库的状态其实文件中保存一条 set test 100 就够了。为了压缩 AOF 的持久化文件,Redis 提供了 AOF重写(ReWriter)机制

AOF 重写机制 在一定程度下减少 aof 文件的体积。

触发重写方式有两种:

1. 客户端方式 触发重写

执行 BGREWRITEAOF 命令,这种方式不会阻塞 redis 的服务;

2. 服务器配置方式 自动触发

配置 redis.conf 中的 auto-aof-rewrite-percentage 选项:

auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb

如果开启了 AOF持久化,以上配置代表:当AOF文件体积大于 64M,并且AOF文件的体积比上一次重写之后体积大了 100%(1倍) 时,自动触发重写。 如果重写过于频繁,可以考虑将 auto-aof-rewrite-percentage 设置的更大。

重写原理

注意:重写 aof文件 的操作,并没有读取旧的 aof文件,而是将整个内存中的数据库内容用命令的方式重写了一个新的 aof文件,替换原有的文件,这点和快照有点类似。

重写流程

  1. redis 调用 fork,现在有父子两个进程,子进程根据内存中的数据库快照,往临时文件中写入重建数据库状态的命令;
  2. 父进程继续处理 client 请求,除了把写命令写入到原来的 aof文件 中,同时 把收到的写命令缓存起来,这样就能保证如果子进程重写失败的话并不会出问题。
  3. 当子进程把快照内容写入已命令方式写到临时文件中后,子进程发信号通知父进程,然后父进程把缓存的写命令也写入到临时文件。
  4. 现在父进程可以使用临时文件替换老的 aof文件,并重命名,后面收到的写命令也开始往新的 aof文件 中追加。

Redis 持久化总结

两种持久化方案既可以同时使用,又可以单独使用,在某种情况下也可以都不使用,具体使用那种持久化方案取决于用户的数据和应用决定。

无论使用 AOF 还是 快照机制持久化,将数据持久化到硬盘都是有必要的,除了持久化外,用户还应该对持久化的文件进行备份(最好备份在多个不同地方)。

Redis 中两种持久化机制详解相关推荐

  1. Redis中两种持久化机制RDB和AOF

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

  2. redis的两种持久化方式详解

    一.背景 在实际开发中,为了保证数据的完整性,防止数据丢失,我们除了在原有的传统数据库保存数据的同时,最好是再用redis持久化再保存一次数据.如果仅仅是使用redis而不进行持久化配置的话,当red ...

  3. Redis的两种持久化机制RDB和AOF

    目录 RDB 原理 触发时机 AOF 原理 开启AOF aof日志文件说明 触发时机 aof的重写机制 redis4.0的混合持久化机制 总结 rdb持久化文件的名称:dump.rdb.存储在配置文件 ...

  4. 安卓中两种压缩图片详解(比例压缩与质量压缩)

    在提图片压缩之前,我先总结下图片的三种常见格式:JPEG,JPG,PNG Jpeg格式   与jpg格式相似,经常在拷相片的时候看到得,但我们制作图片的时候一般是保存jpg,该种图片格式是文件相对jp ...

  5. redis的持久化机制详解

    redis的持久化机制 因为Redis的数据都储存在内存中,当进程退出时,所有数据都将丢失.为了保证数据安全,Redis支持RDB和AOF两种持久化机制有效避免数据丢失问题.RDB可以看作在某一时刻R ...

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

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

  7. PCBA加工中常见的两种焊接方式详解

    PCBA加工中常见的两种焊接方式详解 PCBA加工,两种常见的焊接方式就是回流焊和波峰焊,与手动焊接技术相比,自动焊接技术具有减少人为因素的影响.提高效率.降低成本.提高质量等优势,在PCBA加工中, ...

  8. C语言getline函数CSDN,c++中的两种getline用法详解

    getline是C++标准库函数:但不是C标准库函数,而是POSIX(IEEE Std 1003.1-2008版本及以上)所定义的标准库函数(在POSIX IEEE Std 1003.1-2008标准 ...

  9. Redis的两种持久化介绍与对比

    本文大纲: RDB和AOF两种持久化机制的介绍 RDB持久化机制的优点 RDB持久化机制的缺点 AOF持久化机制的优点 AOF持久化机制的缺点 RDB和AOF到底该如何选择 我们已经知道对于一个企业级 ...

最新文章

  1. 写一个 iOS 复杂表单的正确姿势
  2. 数据中心背后的地缘政治学
  3. 从2018年12月起陆续将博客搬至博客园(cnblogs)
  4. c++ 连续图片显示_计算整数的和并显示结果
  5. 5.非关系型数据库(Nosql)之mongodb:创建集合,备份与导入导出, 数据还原,导入导出
  6. 遥感计算机分类实验的难点,8-遥感实验.doc
  7. Jetty 与 Tomcat 比较,及性能分析
  8. 侦听127.0.01_Spring 4.2中由注释驱动的事件侦听器
  9. linux主机熵值过小,tomcat在linux启动应用慢解决方式
  10. wince系统安装软件_精密空调安装泄漏检测系统软件的作用
  11. 图像处理 - 滤波器 Filter
  12. Ubuntu下安装-有道词典
  13. 【转】 Linux中的工作队列
  14. 笔记:C# log4net App.config 配置系统未能初始化问题的一种处理方法
  15. SEO兵书:搜索引擎优化手册
  16. win10计算机管理看不见蓝牙,win10蓝牙不见了的解决方法
  17. Docker镜像的制作、上传、拉取和部署(利用阿里云)
  18. 华为rh2288v2服务器系统,灵动高效!华为RH2288 V2服务器评测
  19. 批发/零售商家如何合理控制库存?做好优化库存结构
  20. 数据库原理与技术 作业及答案 复习用

热门文章

  1. 见过一些能力非常强的但创业总是失败
  2. IDEA开发中常用快捷键
  3. crontab下执行设置壁纸出错问题
  4. vue 侦听器侦听对象属性_SQL Server始终处于侦听器状态
  5. abp vnext_SQL Server vNext – Microsoft是否喜欢Linux?
  6. 201671010439-词频统计软件项目报告
  7. C++学习笔记39:进程概念
  8. MySql的基本操作流程-SAE的MySQL-PHP
  9. 冲刺One之站立会议3 /2015-5-16
  10. Xcode 6.0中彻底关闭ARC