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两种持久化策略分析的更多相关文章

  1. redis两种持久化策略/存储模式

    redis的持久化策略   RDB,即 Redis DataBase,以快照形式将数据写入一个临时文件,持久化结束后,用这个临时文件替换上次持久化的dump文件,达到数据恢复. 默认开启,见redis ...

  2. redis两种持久化方式的优缺点

    redis两种持久化的方式 RDB持久化可以在指定的时间间隔内生成数据集的时间点快照 AOF持久化记录服务器执行的所有写操作命令,并在服务器启动时,通过重新执行这些命令来还原数据集,AOF文件中全部以 ...

  3. Redis两种持久化方式(RDB&AOF)

    爬虫和转载请注明原文地址;博客园蜗牛:http://www.cnblogs.com/tdws/p/5754706.html Redis所需内存 超过可用内存怎么办 Redis修改数据多线程并发—Red ...

  4. (三)Redis两种持久化方案

    Redis的持久化策略:2种 RDB方式的持久化是通过快照(snapshotting)完成的,当符合一定条件时Redis会自动将内存中的数据进行快照并持久化到硬盘.RDB是Redis默认采用的持久化方 ...

  5. redis两种持久化方法对比分析

    1.前言 最近在项目中使用到Redis做缓存,方便多个业务进程之间共享数据.由于Redis的数据都存放在内存中,如果没有配置持久化,redis重启后数据就全丢失了,于是需要开启redis的持久化功能, ...

  6. Redis(十二):redis两种持久化方法对比分析

    前言 最近在项目中使用到Redis做缓存,方便多个业务进程之间共享数据.由于Redis的数据都存放在内存中,如果没有配置持久化,redis重启后数据就全丢失了,于是需要开启redis的持久化功能,将数 ...

  7. redis两种持久化

    Redis 提供了不同级别的持久化方式: RDB持久化方式能够在指定的时间间隔能对你的数据进行快照存储. AOF持久化方式记录每次对服务器写的操作,当服务器重启的时候会重新执行这些命令来恢复原始的数据 ...

  8. redis两种持久化方式RDB和AOF

    目录 前言 1. Redis 数据库结构 2. RDB 持久化 2.1. RDB 的创建和载入 2.1.1. 手动触发保存 SAVE 命令 BGSAVE 命令 SAVE 和 BGSAVE 的比较 2. ...

  9. redis两种持久化的方法

    Redis是一种高级key-value数据库.它跟memcached类似,不过数据可以持久化,而且支持的数据类型很丰富.有字符串,链表,集 合和有序集合.支持在服务器端计算集合的并,交和补集(diff ...

随机推荐

  1. 菜鸟系列Fabric源码学习—orderer服务启动

    Fabric 1.4 orderer 服务启动流程 1.提要 orderer提供broadcast和deliver两个服务接口.orderer节点与各个peer节点通过grpc连接,orderer将所 ...

  2. Hbase初识

    简介 数据模型 相关数据库 典型应用 优势 劣势 key-value Redis 缓存 快速查询 存储数据缺乏结构化 列族 Cassandra,Hbase 分布式的文件系统,大规模的数据存储 易于分布 ...

  3. Java项目多版本部署及快速回滚(含完整命令)

    1. 场景描述 java项目linux环境下快速部署,以前介绍过,今天主要结合linux的软连接,实现版本的快速切换(回滚),包含完整的start.sh与stop.sh,只需修改包名和路径即可运行,有 ...

  4. 关于for循环中使用setTimeout

    我们先来简单了解一下setTimeout延时器的运行机制.setTimeout会先将回调函数放到等待队列中,等待区域内其他主程序执行完毕后,按时间顺序先进先出执行回调函数.本质上是作用域的问题. 因此 ...

  5. php 图片指定留白叠加缩放

    遇到这样一个需求:原图大小不一,而且留白也大小不一,需要将原图切出来一个核心图,然后将图片左右留白,组成一个其他尺寸的图片.换句话说,原图在新图片中的位置是可以控制的. 这里思路是:先创建一个规定大小 ...

  6. Flask容器化部署原理与实现

    本文将介绍Flask的部署方案:Flask + Nginx + uWSGI,并使用docker进行容器化部署,部署的实例来源 Flask开发初探,操作系统为ubuntu. Flask系列文章: Fla ...

  7. 15.Django基础十一之认证系统

    一 auth模块 我们在开发一个网站的时候,无可避免的需要设计实现网站的用户系统.此时我们需要实现包括用户注册.用户登录.用户认证.注销.修改密码等功能,这还真是个麻烦的事情呢. Django作为一个 ...

  8. Golang中的布隆过滤器

    目录 1. 布隆过滤器的概念 2. 布隆过滤器应用场景 3. 布隆过滤器工作原理 4. 布隆过滤器的优缺点 5. 布隆过滤器注意事项 6. Go实现布隆过滤器 1. 布隆过滤器的概念 布隆过滤器(Bl ...

  9. JavaScript基础5

    字符串操作方法和属性 length   获取字符串的长度 str.chartAt(指定字符的索引)  获取指定位置的字符 返回string类型的值 str.concat(字符串)   链接多个字符串  ...

  10. 拓展KMP分析

    拓展kmp是对KMP算法的扩展,它解决如下问题: 定义母串S,和字串T,设S的长度为n,T的长度为m,求T与S的每一个后缀的最长公共前缀,也就是说,设extend数组,extend[i]表示T与S[i ...