Redis两种持久化策略分析
Redis专题地址:https://www.cnblogs.com/hello-shf/category/1615909.html
SpringBoot读源码系列:https://www.cnblogs.com/hello-shf/category/1456313.html
Elasticsearch系列:https://www.cnblogs.com/hello-shf/category/1550315.html
数据结构系列:https://www.cnblogs.com/hello-shf/category/1519192.html
一、为什么要持久化
redis为什么这么受欢迎的一个主要原因就是QPS高,也就是快。为什么快?主要原因数据都在内存里。如果redis服务器宕机了,内存中的数据是不是都丢了呢?是的,所以我们需要持久化,防止redis宕机导致的缓存数据丢失。有人说了,丢了就丢了呗,反正也是缓存数据,持久化数据都在数据库呢。这么说也没毛病,你想想缓存了那么多数据,再从数据库一条一条的加入缓存?假如redis宕机发生在秒杀环节呢?那这么说缓存是不是等于没做?
二、redis持久化方案
redis有两种持久化方案:RDB和AOF
rdb类似一种数据的备份,就是将缓存中的数据冷备份到磁盘。需要恢复直接将改文件放到指定目录下即可。恢复速度快,数据丢失相对较多。
aof就是日志记录,将该redis中发生的所有数据变化记录下来。恢复时就可以通过aof中的日志进行恢复。因为是解析日志,恢复速度慢,但是数据丢失少。
如果同时使用 RDB 和 AOF 两种持久化机制,那么在 redis 重启的时候,会使用 AOF 来重新构建数据,因为 AOF 中的数据更加完整。
2.1 RDB
优点:
- 冷热备:RDB会生成多个数据文件,每个数据文件都代表了某一个时刻中redis的数据,这种多个数据文件的方式,非常适合做冷热备。
- 高性能:RDB对redis的对外读写能力影响有限,可以让redis保持高性能,因为redis主进程只需要fork一个子进程,让子进程执行磁盘IO来进行RBD持久化即可。
- 快速恢复:相对AOF持久化机制来说,直接基于RDB的数据恢复更加快速。因为RDB文件就是redis的数据备份。
缺点:
- 数据丢失:如果采用RDB进行数据的备份,数据完整性没有AOF表现的那么好。一般来说RDB数据快照文件是每个5分钟进行一次备份。所以可能会造成5分钟的数据丢失。
- 海量数据阻塞主进程:尽管RDB仅仅是fork一个子进程来执行RDB快照数据文件的备份,如果数据文件特别大,可能导致主进程被阻塞数毫秒甚至是数秒。
2.2 AOF
AOF持久化过程:
1.追加写入
redis将每一条写命令以redis通讯协议添加至缓冲区aof_buf,这样的好处在于在大量写请求情况下,采用缓冲区暂存一部分命令随后根据策略一次性写入磁盘,这样可以减少磁盘的I/O次数,提高性能。
2.同步命令到硬盘
当写命令写入aof_buf缓冲区后,redis会将缓冲区的命令写入到文件,redis提供了三种同步策略,由配置参数appendfsync决定。
优点:
- 数据丢失更少:AOF日志文件每隔一秒会通过fsync刷新到磁盘。所以在默认情况下只会丢失一秒的数据。
- 性能开销小:AOF日志文件即使过大,出现后台重写操作,也不会影响客户端的读写。因为在rewrite log的时候,会对其中的指令进行压缩。创建出一份需要恢复的数据的最小日志出来。在创建新日志文件的时候,老的日志文件还是照常写入。当新的merge后的日志文件ready的时候,在交换新老日志文件即可。
- 灾难性误删除紧急恢复:AOF日志文件的命令通过非常可读的方式进行记录,这个特性非常适合做灾难性的误删除的紧急恢复。比如某人不小心用flushall命令清空了所有数据,只要后台rewrite还没发生,那么就可以立即拷贝AOD文件,将最后一条flushall命令删除,然后再将该AOF文件放回去,然后恢复所有数据。
缺点:
- 性能较低:虽然AOF日志文件采用的是append-only模式写入,所以没有任何磁盘寻址的开销,写入性能非常高,但是相对于RDB持久化来说对redis性能影响还是较高的。每隔一秒执行一次fsync操作,这个开销还是很高的。(联想elasticsearch近实时性)
- 数据恢复慢:因为AOF是基于日志文件的数据恢复,所以相较于RDB数据备份来说数据恢复慢。
三、RDB和AOF的选择
如果对数据完整性要求不高RDF是一种比较好的选择。
如果对数据完整性要求较高,也不要仅仅使用AOF一种方式。毕竟恢复耗时,且基于AOF的数据恢复机制也会导致一些bug出现。
最理想的情况是采用两种方式的结合。AOF来保证数据不丢失,作为数据恢复的第一选择。在需要紧急恢复数据的情况下,可以使用RDB进行一定程度的快速容灾方式。
四、常用配置
RDB持久化配置
Redis会将数据集的快照dump到dump.rdb文件中。此外,我们也可以通过配置文件来修改Redis服务器dump快照的频率,在打开6379.conf文件之后,我们搜索save,可以看到下面的配置信息:
save 900 1 #在900秒(15分钟)之后,如果至少有1个key发生变化,则dump内存快照。
save 300 10 #在300秒(5分钟)之后,如果至少有10个key发生变化,则dump内存快照。
save 60 10000 #在60秒(1分钟)之后,如果至少有10000个key发生变化,则dump内存快照。
RDB在以上配置触发以外,还可以通过以下两种命令进行手动触发:
SAVE:阻塞Redis的服务器进程,直到RDB备份完成。
BGSAVE:Fork出一个子进程来创建RDB文件,不阻塞服务器,进程 lastsave 指令可以查看最近的备份时间。(Copy-on-Write)
AOF持久化配置:
AOF默认是关闭的,可以通过appendonly yes来开启。
appendfsync配置:
- no:不使用fsync方法同步,而是交给操作系统write函数去执行同步操作,在linux操作系统中大约每30秒刷一次缓冲。这种情况下,缓冲区数据同步不可控,并且在大量的写操作下,aof_buf缓冲区会堆积会越来越严重,一旦redis出现故障,数据丢失严重。
- always:表示每次有写操作都调用fsync方法强制内核将数据写入到aof文件。这种情况下由于每次写命令都写到了文件中, 虽然数据比较安全,但是因为每次写操作都会同步到AOF文件中,所以在性能上会有影响,同时由于频繁的IO操作,硬盘的使用寿命会降低。
- everysec:数据将使用调用操作系统write写入文件,并使用fsync每秒一次从内核刷新到磁盘。 这是折中的方案,兼顾性能和数据安全,所以redis默认推荐使用该配置。
参考文献:
https://github.com/hello-shf/advanced-java
如有错误的地方还请留言指正。
原创不易,转载请注明原文地址:https://www.cnblogs.com/hello-shf/p/12059902.html
Redis两种持久化策略分析的更多相关文章
- redis两种持久化策略/存储模式
redis的持久化策略 RDB,即 Redis DataBase,以快照形式将数据写入一个临时文件,持久化结束后,用这个临时文件替换上次持久化的dump文件,达到数据恢复. 默认开启,见redis ...
- redis两种持久化方式的优缺点
redis两种持久化的方式 RDB持久化可以在指定的时间间隔内生成数据集的时间点快照 AOF持久化记录服务器执行的所有写操作命令,并在服务器启动时,通过重新执行这些命令来还原数据集,AOF文件中全部以 ...
- Redis两种持久化方式(RDB&AOF)
爬虫和转载请注明原文地址;博客园蜗牛:http://www.cnblogs.com/tdws/p/5754706.html Redis所需内存 超过可用内存怎么办 Redis修改数据多线程并发—Red ...
- (三)Redis两种持久化方案
Redis的持久化策略:2种 RDB方式的持久化是通过快照(snapshotting)完成的,当符合一定条件时Redis会自动将内存中的数据进行快照并持久化到硬盘.RDB是Redis默认采用的持久化方 ...
- redis两种持久化方法对比分析
1.前言 最近在项目中使用到Redis做缓存,方便多个业务进程之间共享数据.由于Redis的数据都存放在内存中,如果没有配置持久化,redis重启后数据就全丢失了,于是需要开启redis的持久化功能, ...
- Redis(十二):redis两种持久化方法对比分析
前言 最近在项目中使用到Redis做缓存,方便多个业务进程之间共享数据.由于Redis的数据都存放在内存中,如果没有配置持久化,redis重启后数据就全丢失了,于是需要开启redis的持久化功能,将数 ...
- redis两种持久化
Redis 提供了不同级别的持久化方式: RDB持久化方式能够在指定的时间间隔能对你的数据进行快照存储. AOF持久化方式记录每次对服务器写的操作,当服务器重启的时候会重新执行这些命令来恢复原始的数据 ...
- redis两种持久化方式RDB和AOF
目录 前言 1. Redis 数据库结构 2. RDB 持久化 2.1. RDB 的创建和载入 2.1.1. 手动触发保存 SAVE 命令 BGSAVE 命令 SAVE 和 BGSAVE 的比较 2. ...
- redis两种持久化的方法
Redis是一种高级key-value数据库.它跟memcached类似,不过数据可以持久化,而且支持的数据类型很丰富.有字符串,链表,集 合和有序集合.支持在服务器端计算集合的并,交和补集(diff ...
随机推荐
- 预训练语言模型整理(ELMo/GPT/BERT...)
目录 简介 预训练任务简介 自回归语言模型 自编码语言模型 预训练模型的简介与对比 ELMo 细节 ELMo的下游使用 GPT/GPT2 GPT 细节 微调 GPT2 优缺点 BERT BERT的预训 ...
- 解决maven创建过慢问题和快捷键
archetypeCataloginternal idea常用的快捷键 Alt+回车 导入包,自动修正 Ctrl+N 查找类 Ctrl+Shift+N 查找文件 Ctrl+Alt+L 格式化代码 Ct ...
- SpringBoot 整合 Zookeeper 接入Starring微服务平台
背景 最近接的一个项目是基于公司产品Starring做的微服务支付平台,纯后台项目,实现三方支付公司和银行接口来完成用户账户扣款,整合成通用支付接口发布给前端调用. 但是扯蛋了,这边前端什么都不想做, ...
- Java基础面试题及答案(一)
Java 基础部分 1. JDK 和 JRE 有什么区别? JDK:Java Development Kit 的简称,java 开发工具包,提供了 java 的开发环境和运行环境. JRE:Java ...
- 聚类-DBSCAN基于密度的空间聚类
1.DBSCAN介绍 DBSCAN(Density-Based Spatial Clustering of Applications with Noise,具有噪声的基于密度的聚类方法)是一种基于密度 ...
- Java中我常用到的十二个最基本的快捷键
自己在Java中经常用到的快捷键先记下来方便日后学习之用: 1. Ctrl+shift+r:打开资源 这可能是所有快捷键组合中最省时间的了.这组快捷键可以让你打开你的工作区中任何一个文件,而你只需要按 ...
- ftp 客户端 上传
ps: 1.使用netkit-ftp-0.17交叉编译出来的ftp客户端, 2.然后写上传代码,调用ftp传服务器: 3.最好使用bin二进制文件形式传输: 4.ftp客户端和Ubuntu自带的ftp ...
- 面试阿里被“吊打”,一问Spring三不知,半年后二战终拿下offer
Spring框架是一个为Java应用程序的开发提供了综合.广泛的基础性支持的Java平台.Spring帮助开发者解决了开发中基础性的问题,使得开发人员可以专注于应用程序的开发. 近两年来,许多大厂在面 ...
- Echarts自定义折线图例,增加选中功能
用Echarts图表开发,原本的Echarts图例不一定能满足我们的视觉要求. 下面是Echarts 折线图自定义图例,图例checked选中,相应的折线线条会随之checked,其余未选中的图例对应 ...
- 利用scatter()绘制颜色映射的二次方曲线
程序如下: import matplotlib.pyplot as plt x_value = list(range(1, 1001)) y_value = [x**2 for x in x_valu ...