持久化选项简介 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. YOLO实践初探

    学习了Andrew Ng 深度学习第三周卷积神经网络课程后,接着看了看YOLO论文,论文看得懵懵懂懂,沉不下心精雕细琢,手痒痒,迫不及待地想试一试YOLO效果.于是乎,在github上下载了ping星 ...

  2. Abp小试牛刀之 图片上传

    图片上传是很常见的功能,里面有些固定的操作也可以沉淀下来. 本文记录使用Abp vNext做图片上传的姿势. 本文的技术核心与Abp无关,Abp只是手段! 目标 上传图片----->预览图片-- ...

  3. VS编译程序添加图标

    如图 然后编译就就生成有图标的了.

  4. git 清除本地git commit的内容

    由于我经常git add . , 然后再git commit -m "文字说明",这样有时候代码嵌套再另一个项目里面,就会把外面的项目一起提交了,导致提交的代码不是我想要的.小菜鸟 ...

  5. Fast Bokeh Effects Using Low-Rank Linear Filters

    Fast Bokeh Effects Using Low-Rank Linear Filters paper地址:https://www.researchgate.net/publication/27 ...

  6. libzip开发笔记(一):libzip库介绍、编译和工程模板

      前言   Qt使用一些压缩解压功能,选择libzip库,libzip库比较原始,也是很多其他库的基础支撑库.   libzip   libzip是一个C库,用于读取,创建和修改zip档案.可以从数 ...

  7. windows 10放大125%后字体模糊(已解决)、win10 文字放大之后变模糊 解决办法

    windows 10放大125%后字体模糊解决办法 百度搜索 "Windows10_DPI_FIX" 或者用这个地址下载下载地址   https://gallery.technet ...

  8. Kali实现靶机远程控制

    任务一.使用netcat建立监听并连接 1.          在ubuntu开启本地监听,在kali中连接 2.          在kali中开启监听,在ubuntu中反弹连接 任务二.使用met ...

  9. informix部署安装

    informix部署安装 一.环境准备 Linux版本:centos7.6 Linux主机名:localhost informix安装包:ibm.ids.14.10.FC4W1.LNX.tar inf ...

  10. JVM个人总结一

    看了深入理解JAVA虚拟机已经有一段时间了  发现很多东西如果不总结  脑子里总是没有一条线贯穿起来,也比较模糊混乱,所以还是有必要利用逻辑思维图总结下. JVM看了下  大致比较重要的分内存区域划分 ...