Redis 实战 —— 06. 持久化选项
持久化选项简介 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. 持久化选项的更多相关文章
- redis实战笔记(4)-第4章 数据安全与性能保障
本章主要内容 4.1 将数据持久化至硬盘 4.2 将数据复制至其他机器 4.3 处理系统故障 4.4 Redis事务 4.5 非事务型流水线( non-transactional pipeline) ...
- Redis实战 | 持久化、主从复制特性和故障处理思路
前言 前面两篇我们了解了Redis的安装.Redis最常用的5种数据类型.本篇总结下Redis的持久化.主从复制特性,以及Redis服务挂了之后的一些处理思路. 前期回顾传送门: Linux下安装Re ...
- .Net Redis实战——事务和数据持久化
Redis事务 Redis事务可以让一个客户端在不被其他客户端打断的情况下执行多个命令,和关系数据库那种可以在执行的过程中进行回滚(rollback)的事务不同,在Redis里面,被MULTI命令和E ...
- Linux+Redis实战教程_day02_消息订阅与发布_多数据库_redis批量操作-事务_redis持久化
5.扩展知识-消息订阅与发布(了解) 订阅新闻,新闻发布 subscribe channel:订阅频道,例:subscribe mychat,订阅mychat这个频道 psubscribe chann ...
- Redis实战(二)CentOS 7上Redis两种方式持久化
Redis的持久化之RDB RDB方式是通过快照完成的,当符合一定条件时Redis会自动将内存中的所有数据进行快照并且存储到硬盘上. 进行快照的条件在配置文件中指定,有2个参数构成:时间和改动的键的个 ...
- Redis实战
大约一年多前,公司同事开始使用Redis,不清楚是配置,还是版本的问题,当时的Redis经常在使用一段时间后,连接爆满且不释放.印象中,Redis 2.4.8以下的版本由于设计上的主从库同步问题,就会 ...
- Redis实战总结-Redis的高可用性
在之前的博客<Redis实战总结-配置.持久化.复制>给出了一种Redis主从复制机制,简单地实现了Redis高可用.然后,如果Master服务器宕机,会导致整个Redis瘫痪,这种方式的 ...
- Redis实战:如何构建类微博的亿级社交平台
微博及 Twitter 这两大社交平台都重度依赖 Redis 来承载海量用户访问.本文介绍如何使用 Redis 来设计一个社交系统,以及如何扩展 Redis 让其能够承载上亿用户的访问规模. 虽然单台 ...
- Redis 中如何保证数据的不丢失,Redis 中的持久化是如何进行
Redis 中数据的持久化 前言 AOF 持久化 什么是 AOF 持久化 为什么要后记录日志呢 AOF 的潜在风险 AOF 文件的写入和同步 AOF 文件重写机制 AOF 的数据还原 RDB 持久化 ...
随机推荐
- 怎样用Java 8优雅的开发业务
怎样用Java 8优雅的开发业务 目录 怎样用Java 8优雅的开发业务 函数式编程 流式编程 基本原理 案例 优雅的空处理 新的并发工具类CompletableFuture 单机批处理多线程执行模型 ...
- python菜鸟教程学习:数据结构
列表方法 list.append(x):把一个元素添加到列表的结尾,相当于 a[len(a):] = [x]. list.extend(L):通过添加指定列表的所有元素来扩充列表,相当于 a[len( ...
- java基础:数组详解以及应用,评委打分案例实现,数组和随机数综合,附练习案列
1.数组 1.1 数组介绍 数组就是存储数据长度固定的容器,存储多个数据的数据类型要一致. 1.2 数组的定义格式 1.2.1 第一种格式 数据类型[] 数组名 示例: int[] arr; ...
- rocketMq broker.conf全部参数解释
#4.7.1版本 #所属集群名字brokerClusterName=rocketmq-cluster#broker名字,名字可重复,为了管理,每个master起一个名字,他的slave同他,eg:Am ...
- [LeetCode]9. Palindrome Number判断回文数字
/* 查看网上的思路有两种: 1.每次取两边的数,然后进行比较 2.取数的倒置数,进行比较 */ public boolean isPalindrome1(int x) { if (x<0) r ...
- maven打包,跳过生成javadoc
有时候由于代码中注释错误(比如方法参数)或者maven javadoc插件版本有问题,导致打包报错,而我们着急打包验证问题,没有时间一一修改错误,这时候可以先跳过生成javadoc,继续下一步工作. ...
- 多线程写法,消除同步bug
public class Demo01 implements Runnable { private int ticket = 10; @Override public void run() { for ...
- JAVA顺序结构和选择结构
顺序结构 JAVA的基本结构就是顺序结构,除非特别指明,否则按顺序一句一句执行 顺序结构是最简单的算法结构 语句和语句直接,框与框直接就是按从上到下的顺序执行的,它是由若干个依次执行的处理步骤组成的, ...
- C#自定义控件的应用(数据绑定,属性等)
刚刚开始程序设计的码农生涯,也许一些开发工具上的控件可以满足我们的需求,但是随之时间的迁移,我们对控件的呈现形式需求越来越多样化,这个时候就需要我们来自定义控件,我是一个刚刚入职没多久的菜鸟,接触软件 ...
- ABP框架中短信发送处理,包括阿里云短信和普通短信商的短信发送集成
在一般的系统中,往往也有短信模块的需求,如动态密码的登录,系统密码的找回,以及为了获取用户手机号码的短信确认等等,在ABP框架中,本身提供了对邮件.短信的基础支持,那么只需要根据自己的情况实现对应的接 ...
