Redis的三种持久化方法详解

Redis持久化机制详解 | JavaGuide

Redis 不同于 Memcached 的很重要一点就是,Redis 支持持久化,而且支持 3 种持久化方式:

  • 快照(snapshotting,RDB)
  • 只追加文件(append-only file, AOF)
  • RDB 和 AOF 的混合持久化(Redis 4.0 新增)

BRD持久化

快照持久化是 Redis 默认采用的持久化方式,在 redis.conf 配置文件中默认有此下配置:

save 900 1           #在900秒(15分钟)之后,如果至少有1个key发生变化,Redis就会自动触发bgsave命令创建快照。save 300 10          #在300秒(5分钟)之后,如果至少有10个key发生变化,Redis就会自动触发bgsave命令创建快照。save 60 10000        #在60秒(1分钟)之后,如果至少有10000个key发生变化,Redis就会自动触发bgsave命令创建快照。

RDB 创建快照时会阻塞主线程吗?

Redis 提供了两个命令来生成 RDB 快照文件:

  • save : 同步保存操作,会阻塞 Redis 主线程;
  • bgsave : fork 出一个子进程,子进程执行,不会阻塞 Redis 主线程,默认选项。

这里说 Redis 主线程而不是主进程的主要是因为 Redis 启动之后主要是通过单线程的方式完成主要的工作。如果你想将其描述为 Redis 主进程,也没毛病。

AOF持久化

aof的实时性更好, 开启 AOF 持久化后每执行一条会更改 Redis 中的数据的命令,Redis 就会将该命令写入到 AOF 缓冲区 server.aof_buf 中,然后再写入到 AOF 文件中(此时还在系统内核缓存区未同步到磁盘),最后再根据持久化方式( fsync策略)的配置来决定何时将系统内核缓存区的数据同步到硬盘中的。

只有同步到磁盘中才算持久化保存了,否则依然存在数据丢失的风险,比如说:系统内核缓存区的数据还未同步,磁盘机器就宕机了,那这部分数据就算丢失了。

AOF 文件的保存位置和 RDB 文件的位置相同,都是通过 dir 参数设置的,默认的文件名是 appendonly.aof

AOF的工作流程:

  • write:写入系统内核缓冲区之后直接返回(仅仅是写到缓冲区),不会立即同步到硬盘。虽然提高了效率,但也带来了数据丢失的风险。同步硬盘操作通常依赖于系统调度机制,Linux 内核通常为 30s 同步一次,具体值取决于写出的数据量和 I/O 缓冲区的状态。
  • fsyncfsync用于强制刷新系统内核缓冲区(同步到到磁盘),确保写磁盘操作结束才会返回。

AOF的三种同步策略:

  • 如果是 appendfsync always: 每个命令后立即写入
  • 如果是 appendfsync everysec: 每秒写入一次
  • 如果是 appendfsync no: 由操作系统决定何时写入

AOF 为什么是在执行完命令之后记录日志?

  • 避免额外的检查开销,AOF 记录日志不会对命令进行语法检查;
  • 在命令执行完之后再记录,不会阻塞当前的命令执行。

这样也带来了风险(我在前面介绍 AOF 持久化的时候也提到过):

  • 如果刚执行完命令 Redis 就宕机会导致对应的修改丢失;
  • 可能会阻塞后续其他命令的执行(AOF 记录日志是在 Redis 主线程中进行的)。

AOF 重写了解吗?

AOF重写流程: 流程图

  1. 触发重写:
  • Redis可以根据配置自动触发重写(例如,当AOF文件大小超过上一次重写后的一定百分比)
  • 或者通过手动执行BGREWRITEAOF命令触发
  1. 创建子进程:
  • Redis主进程创建一个子进程来执行重写操作
  • 这允许主进程继续服务客户端请求
  1. 创建数据快照:
  • 子进程创建当前数据集的内存快照
  1. 重写AOF文件:
  • 子进程遍历数据快照,生成重建当前数据集所需的最小命令集
  • 这些命令被写入一个新的AOF文件
  1. 累积新写入:
  • 在重写过程中,主进程继续处理写命令
  • 这些新命令被写入旧的AOF文件,同时被存储在一个重写缓冲区中
  1. 同步新写入:
  • 当子进程完成重写后,它通知主进程
  • 主进程将重写缓冲区中的内容追加到新AOF文件末尾
  1. 切换文件:
  • Redis执行一个原子性的替换操作,用新的AOF文件替换旧文件
  1. 完成重写:
  • 重写过程完成,Redis继续使用新的AOF文件进行持久化

AOF重写的好处:

  1. 减小文件大小: 通过合并冗余命令,大幅减少AOF文件的大小
  2. 提高恢复速度: 更小的文件意味着更快的数据恢复
  3. 优化内存使用: 较小的AOF文件减少了磁盘和内存的使用

注意事项:

  • 重写过程可能会暂时增加内存使用
  • 在高负载情况下,可能会影响Redis的性能

AOF 校验机制了解吗?

主要是通过校验和的数字来验证 AOF 文件

  1. 校验和计算:
    • Redis在每次AOF重写操作完成后,会对新的AOF文件内容进行CRC64算法计算,得出一个校验和。
  1. 校验和存储:
    • 计算得到的校验和会被存储在一个单独的文件中,通常命名为[aof-file-name].manifest。
  1. 启动时检查:
    • 当Redis启动时,它会读取AOF文件及其对应的manifest文件。
    • Redis会重新计算AOF文件的CRC64校验和,并与manifest文件中存储的校验和进行比较。
  1. 完整性验证:
    • 如果计算得到的校验和与存储的校验和匹配,Redis认为AOF文件是完整的。
    • 如果校验和不匹配,Redis会报告AOF文件可能已损坏,并可能拒绝启动(取决于配置)。

RDB 和 AOF 的混合持久化

混合持久化的优点:

  • 混合持久化结合了RDB的快速加载和AOF的数据安全性。
  • 在AOF重写时,会同时使用RDB和AOF两种格式。

混合持久化的工作流程: 流程图

a. 触发AOF重写时,Redis执行以下步骤:

  • 创建一个当前数据集的RDB快照。
  • 将这个RDB快照写入新的AOF文件的开头。
  • 从快照创建开始,之后的写操作以AOF格式追加到文件末尾。

b. 最终的AOF文件结构: [RDB数据][AOF增量数据]

优势:

  • 快速加载:重启时可以快速加载RDB部分。
  • 数据安全:最近的变更记录在AOF部分,提供了更好的数据安全性。
  • 文件大小:通常比单纯的AOF文件小,因为RDB格式更紧凑。

重启过程:

  • Redis重启时,先加载RDB部分恢复大部分数据。
  • 然后执行AOF部分的命令来恢复最新的数据变更。

配置方式:

  • 通过设置 aof-use-rdb-preamble yes 来启用混合持久化。
  • 这个选项在Redis 4.0及以上版本可用。

注意事项:

  • 混合持久化文件不向后兼容,旧版Redis可能无法解析。
  • 在进行AOF重写时可能会暂时增加内存使用。

应用场景:

  • 适合既需要快速恢复又要求高数据安全性的场景。
  • 对于大型数据集特别有效,可以显著减少恢复时间。

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

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

相关文章

本地生活商城开发搭建 同城O2O线上线下推广

同城本地化商城目前如火如荼,不少朋友咨询本地生活同城平台怎么开发,今天商淘云与大家分享同城O2O线上商城的设计和开发。 本地生活商城一般会涉及到区域以及频道类,一般下单需要支持用户定位、商家定位,这样利于用户可以快速找到…

51单片机快速入门之按键应用拓展

51单片机快速入门之按键应用拓展 LED的点动控制: 循环检测,当key 为0 时 led 亮 反之为熄灭 while(1){ if(key!1) { led0; }else { led1; } } LED的锁定控制: 当按钮按下,led取反值 while(1) { if(key!1) { led!led; } } LED的4路抢答控制: bz默认为0 !bz 取反值,循环启动…

C++系列-模版

🌈个人主页:羽晨同学 💫个人格言:“成为自己未来的主人~” 非类型模版参数 模板参数分类型模板参数与非类型模板参数 类型形参即:出现在模板参数列表,跟在class或者typename之类的参数类型名称 非类型形参即&am…

SpringBoot 数据库表结构文档生成

官方地址&#xff1a;https://github.com/pingfangushi/screw screw 螺丝钉&#xff0c;支持以下数据库 MySQL MariaDB TIDB Oracle SqlServer PostgreSQL Cache DB&#xff08;2016&#xff09; 生产文档支持 html word markdown 开始 添加依赖 <!-- 螺丝钉 --><…

软件测试技术之 GPU 单元测试是什么!

1 背景 测试是开发的一个非常重要的方面&#xff0c;可以在很大程度上决定一个应用程序的命运。良好的测试可以在早期捕获导致应用程序崩溃的问题&#xff0c;但较差的测试往往总是导致故障和停机。 单元测试用于测试各个代码组件&#xff0c;并确保代码按照预期的方式工作。单…

三维重建的几何评价指标

1.三维重建的几何评价指标 1.1 Chamfer Distance Geometry quality (1) Chamfer Distance&#xff08;CD&#xff09; CD衡量两组点云之间的几何差异&#xff0c;距离越小越好。 CD是一种用于衡量两个点云之间相似度的常用几何评价指标。它计算一个点云中每个点到另一个点云的…

seL4 Threads(四)

官网链接: Threads Threads 这篇教程主要是使用seL4中的threads。 TCB Thread Control Blocks seL4提供了线程代表执行的上下文以及管理处理器时间。seL4中的线程是通过线程控制块对象&#xff08;TCB&#xff09;实现的&#xff0c;每个内核线程都有一个线程控制块。 线程…

Web3技术在元宇宙中的应用:从区块链到智能合约

随着元宇宙的兴起&#xff0c;Web3技术正逐渐成为其基础&#xff0c;推动着数字空间的重塑。元宇宙不仅是一个虚拟世界&#xff0c;它还代表着一个由去中心化技术驱动的新生态系统。在这个系统中&#xff0c;区块链和智能合约发挥着至关重要的作用&#xff0c;为用户提供安全、…

Vue | watch监听

Vue | watch监听 在Vue.js的世界里&#xff0c;watch监听器是一个强大且灵活的工具&#xff0c;它允许我们在数据变化时执行特定的逻辑。本文将深入探讨watch的出现背景、使用方法、应用场景、源码原理以及扩展技巧&#xff0c;旨在帮助读者全面掌握这一重要特性。 文章目录 Vu…

TMStarget学习——T1 Segmentation数据处理及解bug

最新学习季公俊老师的神器 TMStarget 的第一个模块基于结构像的靶区计算T1 segmentation。下面上步骤&#xff1a; (1)在github 上下载 TMStarget https://github.com/jigongjun/Neuroimaging-and-Neuromodulation (2)按照要求下载依赖工具软件AFQ、vistasoft、SPM12 &#…

笔试编程-百战成神——Day02

1.简写单词 题目来源&#xff1a; 简写单词——牛客网 测试用例 算法原理 本题的主要难点就是如何识别每一个单词并且返回其首字母大写&#xff0c;最终组成一个新的字符串后输出&#xff0c;这里我们使用while(cin>>str)就可以解决&#xff0c;直接忽略每一个空格直接…

20240926 每日AI必读资讯

一个开源的自托管 AI 入门工具包 - 此工具包利用Docker Compose模板&#xff0c;包含多种本地AI工具并提供AI工作流模板和网络配置&#xff0c;简化了本地AI工具的安装和使用。 安装它将拥有&#xff1a; • 一个拥有 400 多个 AI 组件和集成的低代码平台 • Ollama&#xf…

基于stm32物联网身体健康检测系统

在当今社会&#xff0c;由于经济的发展带来了人们生活水平不断提高&#xff0c;但是人们的健康问题却越来越突出了&#xff0c;各种各样的亚健康随处可在&#xff0c;失眠、抑郁、焦虑症&#xff0c;高血压、高血糖等等侵袭着人们的健康&#xff0c;人们对健康的关注达到了一个…

单细胞Scanpy流程学习和整理(单样本10X数据读取/过滤/降维/聚类)

打算仔细学习一下基于python的单细胞相关分析框架hhh 新手上路写的很繁琐&#xff0c;多多包涵&#xff0c;本次用的IDE是Visual studio code。 流程来自Scanpy官网(Preprocessing and clustering 3k PBMCs (legacy workflow))&#xff1a; https://scanpy.readthedocs.io/e…

01【MATLAB】最小二乘系统辨识

目录 1.系统辨识的定义及其分类 1.1 系统辨识的定义 1.2 系统辨识的分类 2.参数模型 3.系统辨识的步骤 一、最小二乘法&#xff08;Least Squares Method&#xff09;一般步骤 二、LSM原理及应用 三、LSM在控制系统建模中的应用 1.系统辨识的定义及其分类 1.1 系统辨识的…

力扣P1706全排列问题 很好的引入暴力 递归 回溯 dfs

代码思路是受一个洛谷题解里面大佬的启发。应该算是一个dfs和回溯的入门题目&#xff0c;很好的入门题目了下面我会先给我原题解思路我想可以很快了解这个思路。下面是我自己根据力扣大佬写的。 我会进行详细讲解并配上图辅助理解大家请往下看 #include<iostream> #inc…

【机器学习】Flux.jl 生态

官方API https://fluxml.ai/Flux.jl/stable/ecosystem/ 官网给出了 Flux’s model-zoo&#xff0c; 是一个庞大的案例库&#xff0c; 可以提供直观的参考&#xff0c; 并且还列举了基于 Flux.jl 开发的第三方库。 机器视觉 ObjectDetector.jl YOLO 抓取的“预备跑” 图像Met…

使用vite+react+ts+Ant Design开发后台管理项目(一)

前言 本文将引导开发者从零基础开始&#xff0c;运用vite、react、react-router、react-redux、Ant Design、less、tailwindcss、axios等前沿技术栈&#xff0c;构建一个高效、响应式的后台管理系统。通过详细的步骤和实践指导&#xff0c;文章旨在为开发者揭示如何利用这些技…

SpringCloud Alibaba之Seata处理分布式事务

&#xff08;学习笔记&#xff0c;必用必考&#xff09; 问题&#xff1a;Transactional 的9种失效场景&#xff1f; 1、介绍 1.1、简介 官网地址&#xff1a;Apache Seata 源码地址&#xff1a;Releases apache/incubator-seata GitHub Seata是一款开源的分布式事务解决…

Thinkphp5x远程命令执行 靶场攻略

环境配置 靶场&#xff1a;vulhub/thinkphp/5-rce docker-compose up -d #启动环境 漏洞复现 1.访问靶场&#xff1a;http://172.16.1.198:8080/ 2.远程命令执⾏ POC&#xff1a; ?sindex/think\app/invokefunction&functioncall_user_func_array&vars[0]system…