持久化

redis持久化是指在指定的时间间隔内将内存中的数据集快照(snapshotting)写入磁盘,恢复时是将快照文件读入内存 redis提供了两种持久化方式

一:RDB内存快照

1:概念

    RDB的实现方式为,在指定时间将当前时刻内存中的数据生成一个快照文件(.rdb文件,默认为dump.rdb),并将这个快照文件保存到磁盘上。这样,即使redis宕机了,下次重启时也可以通过读取这个快照文件来恢复数据。
    rdb文件默认文件名为dump.rdb,是在配置文件中配置的如果我们想要修改这个名字可以修改下面的配置:

2:配置触发RDB快照的方式

触发生成rdb快照文件的方式主要有五种:配置文件自动触发、执行save命令、执行bgsave命令、执行shutdown命令、执行flushall命令。

  1. :自动触发

配置文件

解释:900秒内有一个key被修改,触发RDB。

300秒有10个key被修改,触发RDB

60秒内有10000个key被修改,触发RDB

  1. :执行save命令(手动)

该命令会阻塞当前Redis服务器,执行save命令期间,Redis不能处理其他命令,直到RDB过程完成为止。

显然该命令对于内存比较大的实例会造成长时间阻塞,这是致命的缺陷,为了解决此问题,Redis提供了第二种方式bgsave命令。

  1. :bgsave命令(手动)

执行该命令时,Redis会在后台异步进行快照操作,快照同时还可以响应客户端请求。具体操作是Redis进程执行fork操作创建子进程,RDB持久化过程由子进程负责,完成后自动结束。阻塞只发生在fork阶段,一般时间很短。基本上 Redis 内部所有的RDB操作都是采用 bgsave 命令。

  1. :执行shutdown命令

这种触发方式比较简单,只需要在客户端执行shutdown命令即可:

  1. :执行flushall命令

flushall命令是清空redis内存中的数据,并且同时清空dump.rdb文件。所以这个命令就相当于删库跑路,此处只是说明该命令会触发rdb,实际使用中千万不要执行。

3:RDB方式的其它几个参数

stop-writes-on-bgsave-error:默认值为yes。当启用了RDB且最后一次后台保存数据失败,Redis是否停止接收数据。这会让用户意识到数据没有正确持久化到磁盘上,否则没有人会注意到灾难(disaster)发生了。如果Redis重启了,那么又可以重新开始接收数据了。

rdbcompression :默认值是yes。对于存储到磁盘中的快照,可以设置是否进行压缩存储。如果是的话,redis会采用LZF算法进行压缩。如果你不想消耗CPU来进行压缩的话,可以设置为关闭此功能,但是存储在磁盘上的快照会比较大。

rdbchecksum :默认值是yes。在存储快照后,我们还可以让redis使用CRC64算法来进行数据校验,但是这样做会增加大约10%的性能消耗,如果希望获取到最大的性能提升,可以关闭此功能。

dbfilename :设置快照的文件名,默认是 dump.rdb

dir:设置快照文件的存放路径,这个配置项一定是个目录,而不能是文件名。默认是和当前配置文件保存在同一目录。

二:AOF日志记录

1:概念

AOF是redis提供的另一种数据持久化方式,它会记录客户端对redis服务端的每一次写操作,并将这些写操作以redis协议追加保存到后缀为aof的文件末尾。在redis服务器重启时,会读取并加载aof文件,达到恢复数据的目的。

aof持久化方式redis是默认不开启的,我们可以通过配置文件开启aof持久化方式:

2:AOF三种写入策略

  1. :appendfsync always

客户端对redis服务器的每次写操作都写入AOF日志文件。这种方式是最安全的方式,但每次写操作都进行一次磁盘IO,非常影响redis的性能,所以一般不使用这种方式。

  1. appendfsync everysec

每秒刷新一次缓冲区中的数据到AOF文件。这种方式是redis默认使用的策略,是考虑数据完整性和性能的这种方案,理论上,这种方式最多只会丢失1秒内的数据。

  1. appendfsync no

redis服务器不负责将数据写入到AOF文件中,而是直接交给操作系统去判断什么时候写入。这种方式是最快的一种策略,但丢失数据的可能性非常大,因此也是不推荐使用的。

3:AOF重新

既然AOF是通过日志追加的方式来存储redis的写指令,那么当我们对同一个key做多次写操作时,就会产生大量针对同一个key操作的日志指令,导致AOF文件会变得非常大,恢复数据的时候会变得非常慢。因此,redis提供了重写机制来解决这个问题。redis通过重写AOF文件,保存的只是恢复数据的最小指令集。

  1. :手动触发

发送命令:bgrewriteaof

  1. :通过配置文件自动触发

    auto-aof-rewrite-percentage 100:当文件的大小达到原先文件大小(上次重写后的文件大小,如果没有重写过,那就是redis服务启动时的文件大小)的两倍。auto-aof-rewrite-min-size 64mb:文件重写的最小文件大小,即当AOF文件低于64mb时,不会触发重写。

注:只有这两个指标同时满足的时候才会发生重写。

三:AOF与RDB比较

1:RDB的优点:

RDB文件非常紧凑,节省内存空间;

RDB 在恢复大数据集时的速度比 AOF 的恢复速度要快;

适合全量备份、全量复制的场景,经常用于灾难恢复(对数据的完整性和一致性要求相对较低的场合)

2:RDB的缺点:

服务器宕机时,可能会丢失部分数据;

每次保存RDB的时候,Redis都要fork出一个子进程,这个过程是阻塞的,如果数据集巨大,那阻塞的时间就会很长。

3:AOF的优点:

数据更加完整,丢失数据的可能性较低;

AOF日志文件可读,并且可以对AOF文件修复。

4:AOF的缺点:

AOF日志记录在长期运行中逐渐庞大,恢复起来非常耗时,需要定期对AOF日志进行瘦身处理;

恢复备份速度比较慢。

redis持久化配置及两种方式相关推荐

  1. (9) hibernate加载持久化对象的两种方式——get、load

    一.get与load对比 在hibernate中get和load方法是根据id取得持久化对象的两种方法,但在实际使用的过程中总会把两者混淆,不知道什么情况下使用get好,什么时候使用load方法效率更 ...

  2. springboot项目中利用@WebFilter注解和@Bean配置类两种方式实现Filter过滤器

    过滤器(Filter) 过滤器实际上就是对web资源进行拦截,做一些处理后再交给下一个过滤器或servlet处理.通常都是用来拦截request进行处理的,也可以对返回的response进行拦截处理 ...

  3. Redis - 持久化有哪几种方式,怎么选?

    1.AOF 持久化 Redis是基于内存的,如果Redis服务器挂了,数据就会丢失.为了避免数据丢失了,Redis提供了两种持久化方式,RDB和AOF.我们先来介绍AOF. AOF(append on ...

  4. redis优化查询的两种方式

    前言 一般来说,查询成为很多应用对外的性能瓶颈,其主要原因在于一旦并发量上来了,应用后台和数据库或者其他的存储服务的IO交互次数增多了,而服务器的线程资源开销是有限的,如何减少IO次数,这是优化要考虑 ...

  5. Linux系统安装JDK级环境变量配置(两种方式多Linux版本)

    文章目录 一.说明 二.第一种方式:通过命令直接安装 二.手动安装方式 三.总结 声明 一.说明 Java JDK在linux系统有两个版本,一个开源版本Openjdk,还有一个oracle官方版本j ...

  6. 在jenkins上配置 sonar 两种方式的区别

    sonarqube 上的sonarScanner 只有最新版本: github上有所有的版本;https://github.com/SonarSource/sonar-scanner-cli/rele ...

  7. ESLint共享配置的两种方式eslint-plugin和eslint-config

    使用ESLint很久了,也看了ESLint官方文档很多遍,但对于ESLint配置的规则还是不胜清楚,例如: {"extends": ["plugin:prettier/r ...

  8. php+redis+两种驱动,redis的php驱动两种方式

    方式一.需要生产(开发)环境安装php得c扩展 案例:<?php $redis=new Redis(); $redis->connect('192.168.1.96','6379'); $ ...

  9. Spring Cloud Alibaba - 19 Nacos Config配置中心加载不同微服务的通用配置的两种方式

    文章目录 Pre 实现 方式一 通过 shared-dataids 方式 方式二 通过 ext-config方式 配置文件优先级 源码 Pre Spring Cloud Alibaba - 18 Na ...

最新文章

  1. newlisp 接受jenkins带空格的参数
  2. UVA11292杀怪
  3. flot中文API(转载)
  4. C#接口(Interface)理解
  5. 数据库(4)表的基本操作
  6. 计算机组成原理 第四章 指令系统
  7. nmake命令(windows下的makefile)
  8. 查看pdf文件的目录和添加标签的方法
  9. 蓝桥杯第四届初赛“模拟智能灌溉系统”设计任务书
  10. 服务器ldb文件可以删除,Access数据库锁死,出现.ldb文件解决办法
  11. 微软所有正版软件下载网站ITELLYOU_我是亲民_新浪博客
  12. 通过js获取PHP设置的cookie(全实例讲解)
  13. Vim中快速定位到某一行的方法
  14. 15岁黑进北美防空司令部,社工界的鼻祖如何社工?
  15. Java 丢手绢游戏 求和_java入门小程序—17人游戏(丢手绢问题)
  16. AutoFlowLayout的报错处理
  17. height:100%与height:inherit的区别
  18. 2021年G1工业锅炉司炉考试资料及G1工业锅炉司炉考试试卷
  19. #warning的用处
  20. MySql分组后随机获取每组一条数据

热门文章

  1. 车载3G Wi-Fi 路由器设备安装雪佛兰
  2. layui分页组件使用
  3. 机顶盒能用鸿蒙吗,网络机顶盒怎么选?避坑必看的三大实用选购技巧
  4. 抖音直播间全功能引流脚本,解放双手自动引流软件工具【引流脚本+技术教程】
  5. python3 md5源码实现(没有调库)适合用作密码学(实验)作业
  6. 花呗额度突然清零再还款会有额度吗?
  7. Python学习:构造函数与析构函数
  8. IndentationError: unindent does not match any outer indentation level(缩进问题)
  9. oracle sql developer 自动提交,PL/SQL Developer 自动提交事务的设置
  10. pycharm怎么用html注释,pycharm怎么注释?