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.mzph.cn/news/739222.shtml

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

相关文章

新手做抖店,0基础玩转抖店,运营实操步骤!

我是电商珠珠 抖店的热度很高,很多新手想要去入驻抖店,但有部分人怕麻烦,不知道抖店操作具体有多复杂。其实,运营抖店很简单,就去选选品、找找达人、找找货源厂家等,具体怎么做,我今天一次性来…

简单使用国产数据库—达梦

达梦数据库是一款由中国的达梦软件公司开发的关系数据库管理系统(RDBMS),它在业界以其高性能、可扩展性和安全性而著称。该系统广泛应用于各种应用程序的数据存储和管理,满足用户对于数据处理和管理的多样化需求。 安装好的达梦数…

【Stable Diffusion】入门:AI绘画提示词+参数设置攻略

目录 1 提示词1.1 分类和书写方式1.1.1 内容型提示词1.1.2 标准化提示词1.1.3 通用模板 1.2 权重1.2.1 套括号1.2.2 数字权重1.2.3 进阶语法 1.3 负面提示词 2 参数详解2.1 Sampling steps2.2 Sampling method2.3 Width, Height2.4 CFG Scale2.5 Seed2.6 Batch count, Batch si…

蓝桥杯Python题目类型

"蓝桥杯"是一项全国性的软件编程竞赛,旨在促进软件和信息技术领域专业人才培养。由于每年的题目都会有所变化,我无法提供具体的蓝桥杯Python题目。但是,我可以告诉你一些通常出现在编程竞赛中的Python题目类型,以及你可…

论文翻译 - BITE: Textual Backdoor Attacks with Iterative Trigger Injection

论文链接:https://arxiv.org/pdf/2205.12700.pdf 项目代码:https://github.com/INK-USC/BITE BITE: Textual Backdoor Attacks with Iterative Trigger Injection Abstract1 Introduction2 Threat Model3 Methodology3.1 Bias Measurement on Label Dist…

Ubuntu20系统安装完后没有WIFI

Ubuntu20系统安装完后没有WIFI 查看后发现是缺少网卡&#xff0c;经过查询之后&#xff0c;发现是HRex39/rtl8852be 然后查询了Kernel版本 Check the Kernel Version in Linux $ uname -srm Linux 5.15.0-67-generic x86_64然后进行下载安装 Build(for kernel < 5.18) …

119.龙芯2k1000-pmon(18)-全自动安装linux系统

经过两天的测试和完善&#xff0c;现在基本已经正常可用了。 &#xff08;全自动是假&#xff0c;接近全自动吧。&#xff09; 需要使用配测电脑的网络功能&#xff0c;windows即可&#xff0c;脱离linux虚拟机。&#xff08;理论上讲u盘也是可以的&#xff09; 测试平台&…

客户案例|100M 768 维向量数据,Zilliz Cloud 稳定支持 Shulex VOC 业

日前&#xff0c;国际化 VOC SaaS 公司数里行间&#xff08;Shulex&#xff09;将上亿数据量的核心业务从开源向量数据库 Milvus 迁移至全托管的向量数据库云服务 Zilliz Cloud。 相比于 Milvus&#xff0c;Zilliz Cloud 实现了 Shulex VOC 评论分析洞察报告生成速度 30% 的提升…

AI 驱动的医疗变革:迈向未来医疗新生态

直面呼啸而来的人工智能&#xff0c;医疗行业将首当其冲&#xff0c;发生翻天覆地的变化。美国心脏病学家兼基因学教授埃里克托普在《未来医疗》中预测&#xff0c;未来人类将拥有“健康小助手”——个人医疗数据和处理能力&#xff0c;还能轻松预防疾病。诸多评论家也持类似观…

南京观海微电子---快速上手DDR读写例程——DDR接口专栏(三)

1. 前言 本文将向大家介绍如何使用DDR IP核的Native接口来对DDR进行读写操作。 2. DDR IP核接口介绍 要想把DDR3 IP核使用起来&#xff0c;必先需要了解下该IP核有哪些接口。DDR3 IP核接口图如下所示。注&#xff1a;图中展示的为DDR IP的Native接口&#xff0c;除了Native接…

TypeScript之枚举

枚举 枚举 ‘使用枚举我们可以定义一些带名字的常量。使用枚举可以清晰地表达意图或创建一组有区别的用例。TypeScript支持数字的和基于字符串的枚举。 数字枚举 首先我们看看数字枚举&#xff0c;如果你使用过其它编程语言应该会很熟悉。 enum Direction {Up 1,Down,Lef…

PYTHON 120道题目详解(100-102)

100.Python中的装饰器可以用于哪些场景&#xff1f; Python中的装饰器是一个非常强大且灵活的工具&#xff0c;它们可以用于许多不同的场景。以下是一些常见的使用装饰器的场景&#xff1a; 函数增强&#xff1a;装饰器可以用来增强函数的功能&#xff0c;比如添加日志记录、性…

javaEE8(数据库编程课后习题1,2)

一&#xff1a; 二&#xff1a; 数据库内信息&#xff1a; 登录&#xff1a; 注册&#xff1a; Register.jsp <% page pageEncoding"UTF-8" import"java.sql.*"%> <!DOCTYPE html> <html lang"en"> <head> <…

未知生,焉知死!小动物S了,如何处理?一个人一生该坚持的几件事——早读(逆天打工人爬取热门微信文章解读)

天地不仁&#xff0c;以万物为刍狗 引言Python 代码第一篇 人民日报 【夜读】一个人一生该坚持的几件事第二篇 人民日报 来了&#xff01;新闻早班车要闻社会政策 结尾 “未知生&#xff0c;焉知死” 曾经视为定数的冰冷生命 在热烈的内心烛照下 应当焕发出滚烫的热情 唯有热爱…

注意力、自注意力和多头注意力的区别

本文作者&#xff1a; slience_me 注意力、自注意力和多头注意力的区别 理解注意力&#xff08;Attention&#xff09;、自注意力&#xff08;Self-Attention&#xff09;和多头注意力&#xff08;Multi-Head Attention&#xff09;之间的区别非常重要&#xff0c;因为它们是自…

[HackMyVm] Quick

kali:192.168.56.104 主机发现 arp-scan -l # arp-scan -l Interface: eth0, type: EN10MB, MAC: 00:0c:29:d2:e0:49, IPv4: 192.168.56.104 Starting arp-scan 1.10.0 with 256 hosts (https://github.com/royhills/arp-scan) 192.168.56.1 0a:00:27:00:00:05 (Un…

nginx禁止国外ip访问

1.安装geoip2扩展依赖 yum install libmaxminddb-devel -y 2.下载ngx_http_geoip2_module模块 https://github.com/leev/ngx_http_geoip2_module.git 3.编译安装 ./configure --add-module/datasdb/ngx_http_geoip2_module-3.4 4.下载最新数据库文件 模块安装成功后,还要…

【阿里云系列】-基于云效构建部署NodeJS项目到ACK

准备工作 01、编写Dockerfile文件可以根据不同的环境&#xff0c;新建不同的Dockerfile文件&#xff0c;比如Dockerfile-PROD # Deliver the dist folder with NginxFROM nginx:stable-alpine ENV LANGC.UTF-8 ENV TZAsia/ShanghaiCOPY dist/ /usr/share/nginx/html COPY ngi…

speexsdp消除回声

speexsdp需要几秒的滤波时间。我测试4-7秒。 GitHub - cpuimage/WebRTC_AECM: Acoustic Echo Canceller for Mobile Module Port From WebRTC 更快的消除 webrtc_aecm 效果: 这是testecho.c样例的程序。 初始化函数&#xff1a; SpeexEchoState *speex_echo_state_init(in…

React render方法的原理?在什么时候会被触发?

一、原理 首先&#xff0c;render函数在react中有两种形式&#xff1a; 在类组件中&#xff0c;指的是render方法&#xff1a; class Foo extends React.Component {render() {return <div> Foo </div>;} } 在函数组件中&#xff0c;指的是函数组件本身&#x…