Redis系列之持久化机制RDB和AOF

Redis系列之持久化机制RDB和AOF

文章目录

  • 1. 为什么需要持久化?
  • 2. 持久化的方式
  • 3. RDB机制
    • 3.1 RDB机制介绍
    • 3.2 配置RDB
    • 3.3 什么时候触发
    • 3.4 操作实例
    • 3.5 RDB优势和不足
  • 4. AOF机制
    • 4.1 什么是AOF机制?
    • 4.2 同步机制
    • 4.3 重写机制
    • 4.4 AOF的优势和不足
  • 混合模式
  • 参考资料

1. 为什么需要持久化?

Redis的数据是保存在内存中的,如果每次关闭或者机器断电,就会出现数据丢失,所以需要进行持久化保存处理

2. 持久化的方式

Redis进行持久化保存的方式主要有两种:RDB和AOF,在redis官网也有进行介绍: https://redis.io/docs/manual/persistence/

3. RDB机制

3.1 RDB机制介绍

RDB,Redis Database快照,是Redis默认的持久化方案。当满足一定条件的时候,会把当前内存中的数据写到磁盘,生成一个快照文件,默认的文件名为dump.rdb

3.2 配置RDB

可以在redis.conf配置RDB文件的文件名和路径

  # The filename where to dump the DBdbfilename dump.rdb # 文件路径dir ./

3.3 什么时候触发

  • 自动触发

    • 配置触发

      # 在redis.conf配置,配置300s检查一次,至少有1个key被修改就触发
      save 300 10 
      
    • shutdown关闭触发

      在redis执行shutdown正常关闭的时候会去持久化数据到磁盘

    • flushall命令触发

      清空数据操作会触发RDB操作,并且生成一个空的RDB文件,所以,如果没有开启其它持久化方式的时候,使用flushall是很危险的,在生产环境慎用

  • 手动触发

    • save

    • bgsave

      redis-cli使用savebgsave命令

    127.0.0.1:6379> save
    OK
    127.0.0.1:6379> bgsave
    Background saving started
    127.0.0.1:6379>
    

    save和bgsave对比

    命令savebgsave
    IO类型同步异步
    阻塞是(发生在fork)
    复杂度O(n)O(n)
    消耗内存不会消耗额外内存fork消耗内存
    备份主线程去进行备份,备份期间不会去处理其它的指令,其它指令必须等待子线程去进行备份,其它指令正常执行

3.4 操作实例

添加一些数据

127.0.0.1:6379>set k1 1
127.0.0.1:6379>set k2 2
127.0.0.1:6379>set k3 3

查询验证数据是否保存成功

127.0.0.1:6379>keys *

shutdown操作触发RDB进行快照

127.0.0.1:6379>shutdown

在redis目录里对dump.rdb文件进行备份,备份一份新的dump.rdb.backup,然后重新启动redis

然后再来模拟一些删库跑路

127.0.0.1:6379>flushall

然后关闭redis服务端,再启动,发现数据已经丢失,要恢复数据,只能先删了dump.rdb,再将备份的dump.rdb.backup改为dump.rdb,重启redis,发现数据已经恢复

3.5 RDB优势和不足

  • RDB的优点:

    Redis官网总结归纳的redis RDB的优点

    在这里插入图片描述

    • RDB是个紧凑型的文件,适合容灾备份,恢复速度非常快

    • RDB最大限度的提高性能,会fork一个子进程,父进程不会产生磁盘io

    • 可以做到很快的重启

      简而言之,RDB备份与恢复都非常的快

  • RDB的不足:

    在这里插入图片描述

    • 数据安全性不是很高,因为是根据配置的时间来备份,假如每5分钟备份一次,就可能会有5分钟数据的丢失

    • 经常fork子线程,所以会比较耗CPU,对CPU不是很友好

4. AOF机制

由于RDB的数据安全性不是很好,所以redis又提供了另外一种持久化方案,AOF

4.1 什么是AOF机制?

AOF:Append Only File,顾名思义,就是一种追加文件的意思,工作机制比较好理解,redis会将每一个收到的写命令通过write函数追加到文件中,通俗理解就是日志记录

AOF机制默认是关闭的,你可以在配置文件中开启,找到redis.conf

# 默认是关闭的,可以进行开启
appendonly no
# The name of the append only file (default:"appendonly.aof")
appendfilename "appendonly.aof"

4.2 同步机制

在这里插入图片描述

  • appendfsync always:表示每次写入都执行fsync刷新函数,性能会非常慢,但是非常安全
  • appendfsync everysec: 每秒执行一次fsync函数,可能丢失1s的数据
  • appendfsync no:由操作系统保证数据同步到磁盘,速度最快,你的数据只需要交给操作系统就行

4.3 重写机制

由于AOF是追加的形式,所以文件就会越来越大,越大的话,数据加载越慢,所以我们需要对AOF文件进行重写

  • 重写流程:

以redis7之前的版本为例

  1. Redis fork一个子进程,在一个临时文件中写入新的数据
  2. 如果在写入新的文件的过程中,主进程还会有指令进入,那么主进程会在内存缓存区中累计新的指令
  3. 如果子进程重写完成,主进程会收到完成信号,并且将缓存中的指令追加到新的aof文件中
  4. 替换旧的aof文件,并且将新的指令附加到重写好的aof文件中
  • 什么时候重写?

    需要配置文件redis.conf

    # 配置达到百分比大小就触发重写
    auto-aof-rewrite-percentage 100
    # 配置达到文件大小就触发重写,就算达到第一个百分比大小,也必须大于64M才触发重写
    auto-aof-rewrite-min-size 64mb
    

举例,在aof文件达到64mb的时候就重写1次,重写后的aof文件大小假如为50mb,上面第一个配置auto-aof-rewrite-percentage为100,即aof文件到了100mb的时候,进行再次重写

4.4 AOF的优势和不足

  • 优势

    1. 安全性高,就算是使用默认的持久化同步机制,也最多只会导致1s的数据丢失

    2. AOF文件相对安全,AOF文件由于某些原因,比如磁盘满了等导致追加失败,也可以通过redis-check-aof工具来修复

      [root@localhost src]$ ./redis-check-aof --fix append
      
    3. 数据格式都是追加的日志,所以可读性更高

  • 不足

    1. 数据集一般比RDB大
    2. 持久化和加载都比RDB慢
    3. 在redis7.0版本之前,重写的时候,新的指令会缓存到内存区,所以会导致占用大量的内存
    4. 在重写期间,会跟磁盘进行两次IO,一个是写入旧的AOF文件,一个是写入新的AOF文件

混合模式

看了上面的介绍,我们知道RDB和AOF两种方式各有优缺点,RDB会有数据丢失的风险,但是备份和恢复的速度很快,AOF虽然可以保证数据的一致性,但是恢复数据时候会很慢。

所以从Redis4.0之后加了一种混合RDB和AOF的模式,这种模式,前部分是使用RDB格式 作为全量备份,后面部分使用AOF追加的写命令数据作为增量备份

在这里插入图片描述

混合模式开启,在redis.conf里修改配置

aof-use-rdb-preamble yes 

参考资料

  • https://redis.io/docs/management/persistence/
  • Redis进阶 - 持久化:RDB和AOF机制详解
  • Redis两种持久化机制RDB和AOF详解

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/272138.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ES分布式搜索-IK分词器

ES分词器-IK 1、为什么使用分词器? es在创建倒排索引时需要对文档分词;在搜索时,需要对用户输入内容分词。但默认的分词规则对中文处理并不友好。 我们在kibana的DevTools中测试: GET /_analyze {"analyzer": "…

阿里云服务器国外地域有哪些?

阿里云地域没有国外节点?有,阿里云服务器国外地域美国、日本、新加坡、韩国、英国及德国等,阿里云服务器地域遍布全球,共29个地域可选。如果您在购买阿里云服务器时,没有国外地域可选,那是因为活动上提供的…

spring boot 集成 mysql ,mybatisplus多数据源

1、需要的依赖&#xff0c;版本自行控制 <dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId> </dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java<…

unity学习(51)——服务器三次注册限制以及数据库化角色信息6--完结

同一账号只写第一次&#xff0c;不同账号第一次爆炸 &#xff0c;就因为下面部分得到逻辑有问题 修改后的代码如下&#xff1a;1.成功完成角色注册信息的数据库化记录。2.每个账号上限3个角色。3.角色是可以重名的&#xff0c;但是角色的id不会重名。 internal class UserCach…

服务器配置禁止IP直接访问,只允许域名访问

联网信息系统需设置只允许通过域名访问&#xff0c;禁止使用IP地址直接访问&#xff0c;建议同时采用云防护技术隐藏系统真实IP地址且只允许云防护节点IP访问服务器&#xff0c;提升网络安全防护能力。 一、Nginx 修改配置文件nginx.conf&#xff0c;在server段里插入正则表达式…

JimuReport积木报表 v1.7.2 版本发布,低代码报表工具

项目介绍 一款免费的数据可视化报表&#xff0c;含报表和大屏设计&#xff0c;像搭建积木一样在线设计报表&#xff01;功能涵盖&#xff0c;数据报表、打印设计、图表报表、大屏设计等&#xff01; Web 版报表设计器&#xff0c;类似于excel操作风格&#xff0c;通过拖拽完成报…

鸡肋的Git

1.前言 对于大多数开发人员来说&#xff0c;我们大多数在学习或者工作过程中只关注核心部分&#xff0c;比如说学习Java&#xff0c;可能对于大多数人而言一开始都是从Java基础学起&#xff0c;然后408&#xff0c;Spring&#xff0c;中间件等&#xff0c;当你发现很多高深的技…

appium2的一些配置

appium-desktop不再维护之后&#xff0c;需要使用appium2。 1、安装appium2 命令行输入npm i -g appium。安装之后输入appium或者appium-server即可启动appium 2、安装安卓/ios的驱动 安卓&#xff1a;appium driver install uiautomator2 iOS&#xff1a;appium driver i…

数据结构之队列详解(C语言手撕)

&#x1f389;个人名片&#xff1a; &#x1f43c;作者简介&#xff1a;一名乐于分享在学习道路上收获的大二在校生 &#x1f648;个人主页&#x1f389;&#xff1a;GOTXX &#x1f43c;个人WeChat&#xff1a;ILXOXVJE &#x1f43c;本文由GOTXX原创&#xff0c;首发CSDN&…

简单题我重拳出击

有请第一位嘉宾&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 给你一个 非严格递增排列 的数组 nums &#xff0c;请你 原地 删除重复出现的元素&#xff0c;使每个元素 只出现一次 &#xff0c;返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 n…

【golang】Windows与Linux交叉编译保姆级教程

【golang】Windows与Linux交叉编译 大家好 我是寸铁&#x1f44a; 总结了一篇【golang】Windows与Linux交叉编译的文章✨ 喜欢的小伙伴可以点点关注 &#x1f49d; 问题背景 今天寸铁想将Windows中的程序部到Linux下跑&#xff0c;我们知道在从Windows与Linux下要进行交叉编译…

Swift SwiftUI 学习笔记 2024

Swift SwiftUI 学习笔记 2024 一、资源 视频资源 StanfordUnivercity 公开课 2023: https://cs193p.sites.stanford.edu/2023 教程 Swift 初识&#xff1a;基础语法&#xff1a;https://docs.swift.org/swift-book/documentation/the-swift-programming-language/guidedtour/…

Util工具类功能设计与类设计(http模块一)

目录 类功能 类定义 类实现 编译测试 Split分割字符串测试 ReadFile读取测试 WriteFile写入测试 UrlEncode编码测试 UrlDecode编码测试 StatuDesc状态码信息获取测试 ExtMime后缀名获取文件mime测试 IsDirectory&IsRegular测试 VaildPath请求路径有效性判断测…

IPSEC VPPN实验

实验背景&#xff1a;FW1和FW2是双机热备的状态。 实验要求&#xff1a;在FW和FW3之间建立一条IPSEC通道&#xff0c;保证10.0.2.0/24网段可以正常访问到192.168.1.0/24 IPSEC VPPN实验配置&#xff08;由于是双机热备状态&#xff0c;所以FW1和FW2只需要配置FW1主设备即可&…

docker学习进阶

一、dockerfile解析 官方文档&#xff1a; Dockerfile reference | Docker Docs 1.1、dockfile是什么&#xff1f; dockerfile是用来构建docker镜像的文本文件&#xff0c;由一条条构建镜像所需的指令和参数构成的脚本。 之前我们介绍过通过具体容器反射构建镜像(docker comm…

数据库系统概念(第一周)

⚽前言 &#x1f3d0;四个基本概念 一、数据 定义 种类 特点 二、数据库 三、数据库管理系统&#xff08;DBMS&#xff09; 四、 数据库系统&#xff08;DBS&#xff09; &#x1f3c0;数据库系统和文件系统对比 文件系统的弊端 &#x1f94e;数据视图 数据抽象 …

【uniapp】uniapp小程序中实现拍照同时打开闪光灯的功能,拍照闪光灯实现

一、需求前提 特殊场景中&#xff0c;需要拍照的同时打开闪光灯&#xff0c;&#xff08;例如黑暗场景下的设备维护巡检功能&#xff09;。 起初我是用的uviewui中的u-upload组件自带的拍照功能&#xff0c;但是这个不支持拍照时打开闪光灯&#xff0c;也不支持从通知栏中打开…

Svg Flow Editor 原生svg流程图编辑器(一)

系列文章 Svg Flow Editor 原生svg流程图编辑器&#xff08;二&#xff09; 效果展示 项目概述 svg flow editor 是一款流程图编辑器&#xff0c;提供了一系列流程图交互、编辑所必需的功能&#xff0c;支持前端研发自定义开发各种逻辑编排场景&#xff0c;如流程图、ER 图、…

JavaEE企业开发新技术

目录 2.1 Class对象基本概念 1、概念 2.2 Class对象的获取方式 2.3基本数据类型的Class对象 1、概念 2.4 反射的基本概念 概念 2.5 Class对象的基本使用-1 2.6 Class对象的基本使用-2 newInstance()和new()区别&#xff1a; 2.1 Class对象基本概念 1、概念 反射的…

ubuntu22.01安装及配置

前言 本次安装基于VMware Pro 16进行安装。 ubuntu版本&#xff1a;ubuntu-22.04.3-live-server-amd64.iso 1、下载 1.1官网下载 https://ubuntu.com/download 1.2、清华大学镜像网站下载 https://mirrors.tuna.tsinghua.edu.cn/ 进入网站后搜索ubuntu&#xff0c;选择ubu…