持久化选项简介 P61

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

  • RDB(redis database):可以将某一时刻的所有数据都写入硬盘里面。(保存的是数据本身)
  • AOF(append only file):会在执行命令时,将被执行的写命令复制到硬盘里面。(保存的是数据的变更记录)

两种持久化方法既可以同时使用,又可以单独使用,在某些情况下甚至可以两种方法都不使用,具体选择哪种持久化方法需要根据数据以及应用来决定。

快照持久化 P62

配置选项
# 持久化触发条件:seconds 秒内至少有 changes 个键被更改
# save <seconds> <changes>
#
# 默认配置以下三个触发持久化的条件
# 【注】注释掉所有 save 的配置,就不会开启快照持久化
#
# 900 秒(15 分钟)内至少有 1 个键被更改
# 300 秒(5 分钟)内至少有 10 个键被更改
# 60 秒(1 分钟)内至少有 10000 个键被更改
save 900 1
save 300 10
save 60 10000 # 如果快照持久化开启
# yes:后台持久化操作失败时,Redis 就会停止接受更新操作(默认 yes)
# no :后台持久化操作失败时,Redis 仍然可以继续正常工作
stop-writes-on-bgsave-error yes # 在进行镜像备份时,是否进行压缩
# yes:压缩,会有更多 cpu 消耗,时间会更长(默认 yes)
# no :不压缩,需要更多磁盘空间
rdbcompression yes # 数据库文件的文件名
dbfilename dump.rdb # 工作目录,数据库文件的位置
# AOF(append only file)也会在此目录创建
dir ./

如果新的快照文件创建完成之前,Redis 、 系统或者硬件这三者之中的任意一个崩溃了,那么 Redis 将丢失最近一次成功创建快照之后写入的所有数据。快照持久化只适用于那些即使丢失一部分数据也不会造成问题的程序,而不接受数据损失的程序可以考虑使用 AOF 持久化。 P63

创建快照的方法 P63
  • 客户端可以通过向 Redis 发送 BGSAVE 命令来主动创建快照。对于支持 BGSAVE 命令的平台(除了 Windows 平台)来说,由 fork 创建出的子进程负责将快照写入硬盘,父进程继续处理命令请求。

  • 客户端可以通过向 Redis 发送 SAVE 命令来主动创建快照,接到 SAVE 命令的 Redis 服务器在快照创建完毕之前不会响应任何命令。

  • 设置了 save 配置选项,那么当任意一个条件满足时, Redis 就会自动触发一次 BGSAVE 命令。

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

  • 当一个 Redis 服务器连接另一个 Redis 服务器,并向对方发送 SYNC 命令来开始一次复制操作的时候,如果主服务器目前没有在执行 BGSAVE 操作,或者并非刚刚执行完 BGSAVE 操作,那么主服务器就会执行 BGSAVE 命令。

    the master Redis server will start a BGSAVE operation if one isn’t already executing or recently completed.

    斜体加粗的部分感觉有点难理解,第二个就已经包含在第一个条件里了,然后找到英文原文还有点懵。

不同场景下的使用 P64
  • 个人开发:主要考虑尽可能地降低快照持久化带来的资源消耗,只设置 save 900 1 这一条规则。 P64
  • 对日志进行聚合计算:主要考虑 Redis 因为崩溃而未能成功创建新的快照,那么我们能承受丢失多长时间以内产生的新数据。还需要设计如何恢复被中断的聚合计算,可以记录每次处理的日志文件名及偏移量,恢复时按升序从记录处开始处理。 P64
  • 大数据:当 Redis 存储的出具了达到即使 GB 时,执行 BGSAVE 可能会导致系统长时间地停顿,也可能引发系统大量地使用虚拟内存,从而导致 Redis 的性能降低至无法使用的程度。 可以考虑手动发送 BGSAVE 或者 SAVE 来进行持久化,避免自动执行而造成停顿。P65
RDB 的优点
  • 非常紧凑
  • 适合用于灾难恢复
  • 可以最大化 Redis 的性能
  • 恢复大数据集时的速度比 AOF 的恢复速度要快
RDB 的缺点
  • 宕机时丢失数据可能较多
  • 每次持久化时都要 fork() 一个子进程,当数据集比较庞大时可能非常耗时

AOF 持久化 P66

配置选项
# AOF 持久化是否开启
# yes:开启 AOF 持久化,Redis 在启动时会载入 AOF,而忽略快照持久化文件
# no :不开启 AOF 持久化(默认不开启)
appendonly no # AOF 文件名(默认为 appendonly.aof)
appendfilename "appendonly.aof" # Redis 支持三种不同的回写模式
# always :每次写操作都调用 fsync(),立刻写入 AOF 文件。非常慢但是很安全。
# everysec:每秒调用一次 fsync()。折衷方案。(默认为 everysec)
# no :不调用 fsync(),等待操作系统刷数据。很快。
# appendfsync always
appendfsync everysec
# appendfsync no # 如果有延迟问题就将该选项设置为 yes
# 否则就保持 no,这是最安全的方式
no-appendfsync-on-rewrite no # 自动重写 AOF 文件,若百分比设置为 0,则表示禁用自动重写 AOF 文件
# 如果当前 AOF 文件大小以及比上次 AOF 文件大小大了 指定的百分比,则会重写 AOF 文件
# 同时需要指定 AOF 文件重写的最小大小,以避免百分比过小而频繁重写 AOF 文件
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
重写 AOF 文件 P67

Redis 会不断地将被执行的写命令记录到 AOF 文件里面,AOF 文件会不断增大,可能会用完硬盘的所有可用空间,重启之后还原操作也可能执行很长时间。 P68

为了解决 AOF 文件不断增大的问题,用户可以向 Redis 发送 BGREWRITEAOF 命令,这个命令会通过移除 AOF 文件中冗余命令来重写 AOF 文件,使 AOF 文件变得尽可能地小。BGREWRITEAOF 的工作原理和 BGSAVE 创建快照的工作原理非常相似: Redis 会创建一个子进程, 然后由子进程负责对 AOF 文件进行重写。P68

重写 AOF 文件是从数据集中读取键当前的值,然后用一条命令取记录键值对,代替之前记录该键值对的多个命令,最终生产一个新的 AOF 文件,这个文件包含重建当前数据集所需的最少命令。

AOF 的优点
  • AOF 文件只追加,所以写入时不需要进行 seek
  • AOF 文件过大时,后台会自动对 AOF 文件进行重写
  • 有序地保存了数据库执行的所有写入操作,易读懂,也能轻松分析文件
AOF 缺点
  • 相同数据集时,AOF 文件的体积通常大于 RDB 文件的体积
  • 根据所使用的 fsync 策略,AOF 的速度可能会慢于 RDB
  • 个别命令(例如:BRPOPLPUSH source destination timeout)会导致 AOF 文件在重新载入时,无法将数据集恢复成保存时的原样

本文首发于公众号:满赋诸机(点击查看原文) 开源在 GitHub :reading-notes/redis-in-action

Redis 实战 —— 06. 持久化选项的更多相关文章

  1. redis实战笔记(4)-第4章 数据安全与性能保障

    本章主要内容 4.1 将数据持久化至硬盘 4.2 将数据复制至其他机器 4.3 处理系统故障 4.4 Redis事务 4.5 非事务型流水线( non-transactional pipeline) ...

  2. Redis实战 | 持久化、主从复制特性和故障处理思路

    前言 前面两篇我们了解了Redis的安装.Redis最常用的5种数据类型.本篇总结下Redis的持久化.主从复制特性,以及Redis服务挂了之后的一些处理思路. 前期回顾传送门: Linux下安装Re ...

  3. .Net Redis实战——事务和数据持久化

    Redis事务 Redis事务可以让一个客户端在不被其他客户端打断的情况下执行多个命令,和关系数据库那种可以在执行的过程中进行回滚(rollback)的事务不同,在Redis里面,被MULTI命令和E ...

  4. Linux+Redis实战教程_day02_消息订阅与发布_多数据库_redis批量操作-事务_redis持久化

    5.扩展知识-消息订阅与发布(了解) 订阅新闻,新闻发布 subscribe channel:订阅频道,例:subscribe mychat,订阅mychat这个频道 psubscribe chann ...

  5. Redis实战(二)CentOS 7上Redis两种方式持久化

    Redis的持久化之RDB RDB方式是通过快照完成的,当符合一定条件时Redis会自动将内存中的所有数据进行快照并且存储到硬盘上. 进行快照的条件在配置文件中指定,有2个参数构成:时间和改动的键的个 ...

  6. Redis实战

    大约一年多前,公司同事开始使用Redis,不清楚是配置,还是版本的问题,当时的Redis经常在使用一段时间后,连接爆满且不释放.印象中,Redis 2.4.8以下的版本由于设计上的主从库同步问题,就会 ...

  7. Redis实战总结-Redis的高可用性

    在之前的博客<Redis实战总结-配置.持久化.复制>给出了一种Redis主从复制机制,简单地实现了Redis高可用.然后,如果Master服务器宕机,会导致整个Redis瘫痪,这种方式的 ...

  8. Redis实战:如何构建类微博的亿级社交平台

    微博及 Twitter 这两大社交平台都重度依赖 Redis 来承载海量用户访问.本文介绍如何使用 Redis 来设计一个社交系统,以及如何扩展 Redis 让其能够承载上亿用户的访问规模. 虽然单台 ...

  9. Redis 中如何保证数据的不丢失,Redis 中的持久化是如何进行

    Redis 中数据的持久化 前言 AOF 持久化 什么是 AOF 持久化 为什么要后记录日志呢 AOF 的潜在风险 AOF 文件的写入和同步 AOF 文件重写机制 AOF 的数据还原 RDB 持久化 ...

随机推荐

  1. SpringBoot从入门到精通教程(七)

    今天,我们继续讲SpringBoot整合Redis ,也就缓存,它将与我们的Springboot整合 Redis 简介 Redis 是当前比较热门的NOSQL系统之一,它是一个开源的使用ANSI c语 ...

  2. Spring中BeanFactory与FactoryBean到底有什么区别?

    一.BeanFactory BeanFactory是一个接口,它是Spring中工厂的顶层规范,是SpringIoc容器的核心接口,它定义了getBean().containsBean()等管理Bea ...

  3. 最速下降法--MATLAB程序

    function x = fxsteep(f,e,a,b)x1 = a;x2 = b;Q = fxhesson(f,x1,x2);x0 = [x1,x2]';temp = [x0];fx1 = dif ...

  4. PHP代码样例

    1 <?php 2 3 /** 4 * 时间:2015-8-6 5 * 作者:River 6 * 超级有用.必须收藏的PHP代码样例 7 */ 8 class Helper { 9 10 /** ...

  5. RHCE <复习RHSCA>

    什么是shell? shell是你(用户)和Linux(或者更准确的说,是你和Linux内核)之间的接口程序,你在提示符下输入的每个命令都由shell先解释然后传给Linux内核. bash 是大多数 ...

  6. Python获取网页html代码

    获取网页html代码: import requests res = requests.get('https://www.cnblogs.com/easyidea/p/10214559.html') r ...

  7. Java学习日报7.7

    今天进一步学习了eclipse软件,遇到了几次程序运行不成功的问题,检查之后运行成功!明天继续学习程序逻辑控制!

  8. MySQL性能分析show profiles详解

    前言 前几篇文章我们讲了什么是 MySQL 索引,explain分析SQL语句是否用到索引,以及索引的优化等一系列的文章,今天我们来讲讲Show profiles,看看SQL耗时到底出现在哪个环节. ...

  9. MySQL索引优化,explain详细讲解

    前言:这篇文章主要讲 explain 如何使用,还有 explain 各种参数概念,之后会讲优化 一.Explain 用法 模拟Mysql优化器是如何执行SQL查询语句的,从而知道Mysql是如何处理 ...

  10. php利用腾讯ip分享计划获取地理位置示例分享

    <?php function getIPLoc_QQ($queryIP){ $url = 'http://ip.qq.com/cgi-bin/searchip?searchip1='.$quer ...