redis持久化-归纳

2023-10-31

部分参考地址:
        较详细:https://baijiahao.baidu.com/s?id=1654694618189745916
        简明扼要:https://blog.csdn.net/qq_39291929/article/details/103436742
        很全:https://www.cnblogs.com/naci/p/3824815.html
        aof重写机制详解:https://blog.csdn.net/hezhiqiang1314/article/details/69396887


持久化流程 
1. 客户端向服务端发送"写"操作请求(此时,数据存在于客户端内存中) 
2. 数据库服务端接收写请求(此时,数据存在与服务端内存中) 
3. 服务端调用write(write是个系统的调用),将数据向磁盘上写(此时,数据存在于系统内存的缓冲区) 
4. 对系统进行操作,将缓冲区中的数据,写入磁盘控制器(此时,数据存在于磁盘缓存中) 
5. 磁盘控制器将数据写到磁盘的物理介质上(此时,数据真正存在于物理磁盘上了)


持久化方式:

1:RDB(redis database)

快照:每隔指定时间,将所有数据进行拍照保存(相对耗时),redis默认的持久化策略,二进制文件保存,默认文件名dump.rdb。

触发方式:

  1. 客户端发送指令 save:会阻塞当前redis服务器,执行save命令期间,redis不饿能处理其他命令,直到rdb过程结束执行完成后, 如果发现存在就得rdb文件,则用新的替换掉旧的。(若数据量大,则此方式不可取)
  2. 客户端发送指令 bgsave(background save):会在后台进行异步的快照操作,保证了在快照操作的同时,还可以响应客户端请求。
    具体操作:redis进程执行fork操作,创建子进程,持久化操作由子进程负责,完成后自动结束。 也会发生阻塞,但时间很短。基本上redis内部的所有rdb操作都是bgsave命令。快照执行期间,主进程修改的数据不会被保存
  3. 自动触发(配置redis.conf文件,默认使用bgsave命令)
    - 文件内搜索save:其中的 **save seconds changes**为触发快照的条件,即:当**seconds**秒内,数据被修改了**changes**次,就会触发rdb快照。
    - 文件内搜索stop-writes-on-bgsave-error :默认值为yes:当启用了RDB且最后一次后台保存数据失败,Redis是否停止接收数据。这会让用户意识到数据没有正确持久化到磁盘上,否则没有人会注意到灾难(disaster)发生了。如果Redis重启了,那么又可以重新开始接收数据了;
    - 文件搜索rdbcompression ;默认值是yes。:对于存储到磁盘中的快照,可以设置是否进行压缩存储。
    - 文件搜索rdbchecksum :默认值是yes:在存储快照后,我们还可以让redis使用CRC64算法来进行数据校验,但是这样做会增加大约10%的性能消耗,如果希望获取到最大的性能提升,可以关闭此功能。
    - 文件搜索dbfilename : 设置快照的文件名,默认是 dump.rdb
    - 文件搜索dir:设置快照文件的存放路径,这个配置项一定是个目录,而不能是文件名。
################################ SNAPSHOTTING  ################################
#
# Save the DB on disk:
#
#   save 
#
#   Will save the DB if both the given number of seconds and the given
#   number of write operations against the DB occurred.
#
# 默认三个都开启,不需要持久化的时候,就注释掉所有的save来停掉保存功能
save 900 1         # 900秒内,只要有1次变化,就执行
save 300 10        # 300秒内,只要有10次变化,就执行
save 60 10000      # 60秒内,只要有10000次变化,就执行

对比:
因为第三种方式是配置的,所以我们对前两种进行一个对比:

    ```
       命令       | save             | bgsave 
       io类型     | 同步              | 不同步 
       阻塞       | 是                | 仅在fork时阻塞 
       优点       | 不占内存           | 不会阻碍客户端请求
       缺点       | 会阻塞客户端的请求  | 需要fork,占用内存,可能会丢失fork期间主进程修改的数据
    ```

优劣:

* 恢复:直接读取持久化文件到内存中(恢复大数据时,速度很快)

* 优势:
1. rdb文件只有一个,存储的是内存数据的二进制序列化形式,且文件紧凑,体量较小(文件不大),全量备份,非常适用于备份和灾难恢复
2. 生成rdb文件时,单独fork一个进程来执行保存操作,主进程不进行任何io,并可同时接受前台的请求
3. 恢复大数据集时速度更快

* 劣势:
当进行快照持久化时,主进程单独fork了一个 子进程 专门负责快照持久化,子进程会拥有主进程的内存数据,主进程修改内存时, 子进程不会反应出来,所以在快照持久化期间主进程修改的数据不会被保存,可能丢失数据。

2.AOF(appendonly.aof)

* 增量追加:调用write函数进行文件使用增量追加(类似于日志模式)

* 触发方式:
    * (1)always(每有修改同步):

        每当有一个“写”命令过来时,则通过write函数,直接保存命令本身到aof文件的末尾
    * (2)everysec(每秒同步):

        异步操作,每秒记录 (如果一秒内宕机,有数据丢失)
    * (3)no(不同步):从不同步
    ```
       命令       | always              | everysec
       优点       | 不丢数据             | --
       缺点       | io开销很大,一般的    |丢一秒数据
                  | sata盘只有击败tps 
    ```

* 文件重写:

触发:由系统判断是否满足重写条件,或客户端输入命令 bgrewriteaof

重写后的新 AOF 文件包含了恢复当前数据集所需的最小命令集合。

为了压缩此文件,官方给出了**bgrewriteaof**命令,将内存中的数据以命令的方式保存到临时文件中, 同时会fork出一个新进程来将文件重写 重写的过程中,并没有读取旧的aof文件,而是将整个内存中的数据库内容用命令的方式重写了一个新的aof文件(类似于快照) aof 持久化是通过保存被执行的写命令来记录数据库状态的,所以AOF文件的大小随着时间的流逝一定会越来越大; 越来越大的aof文件影响包括但不限于:对于Redis服务器,计算机的存储压力;AOF还原出数据库状态的时间增加;

为了解决AOF文件体积膨胀的问题,Redis提供了AOF重写功能:Redis服务器可以创建一个新的AOF文件来替代现有的AOF文件, 新旧两个文件所保存的数据库状态是相同的,但是新的AOF文件不会包含任何浪费空间的冗余命令,通常体积会较旧AOF文件小很多。
详情:https://blog.csdn.net/hezhiqiang1314/article/details/69396887

* 优点

1. 数据完整(每秒/每修改)
2. 几乎不阻塞主进程(仅在重写机制临近结束时,会有暂时性的阻塞)
3. 重写机制保证文件不会过大

* 缺点
1. 相比rdb模式,aof文件还是大了
2. io请求次数还是有点多的,所以速度相对rdb来说 ,无论是存储,还是恢复 还是慢的

如果同时开启了aof和rdb,则系统在恢复数据时,仅会执行aof

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

redis持久化-归纳 的相关文章

  • Redis 写入 .ssh/authorized_keys

    当前设置 2 个主服务器 12 个工作服务器 工作人员通过 ssh copy id 连接到主设备 主设备和工作人员正在主设备上的 redis 队列中写入数据 过去一周我遇到的问题是 Redis 正在将数据写入authorized keys
  • Redis部署配置-主从复制

    目前我有两台服务器 我已经部署了基于node js Express JS的Web服务API 我正在使用 Redis 来缓存 JSON 字符串 将此设置部署到生产中的最佳选择是什么 我懂了here https stackoverflow co
  • 如何在redis中创建自己的数据库?

    There are 0 to 15 databases in redis 我想使用 redis cli 创建自己的数据库 有什么命令可以实现吗 Redis 数据库并不等同于 MySQL 等 DBMS 中的数据库名称 这是一种为键创建隔离和命
  • Spring RedisTemplate:8次调用后方法键挂起

    我使用 Spring RedisTemplate spring data redis 1 7 1 与 Redis 进行通信 我需要通过正则表达式获取然后删除键 例如 context user1 我用的方法 RedisTemplate key
  • 仅当尚未设置时才进行原子设置

    仅当尚未在 Redis 中设置时 是否有办法执行原子设置 具体来说 我正在创建一个像 myapp user user email 这样的用户 并且希望 Redis 在 user email 已被占用时返回错误 而不是默默地替换旧值 比如声明
  • 如何使用Spring Cache处理redis异常?

    我目前正在开发一个包含 Spring Data Redis 和 Spring Cache 的项目 在spring data redis中 我使用redis模板调用redis 我在 try catch 块中处理 redis 模板抛出的所有异常
  • Redis键空间事件不触发

    我有两个 Redis 客户端 在一个文件中我有一个简单的脚本设置并删除了 Redis 键 var redis require redis var client redis createClient 6379 127 0 0 1 client
  • Redis hash写入速度非常慢

    我面临一个非常奇怪的问题 使用 Redis 时 我的写入速度非常糟糕 在理想的情况下 写入速度应该接近 RAM 上的写入速度 这是我的基准 package redisbenchmark import redis clients jedis
  • redis-cli 重定向到 127.0.0.1

    我在PC1上启动Redis集群 然后在PC2上连接它 当需要重定向到另一个集群节点时 它会显示Redirected to slot 7785 located at 127 0 0 1 但应该显示Redirected to slot 7785
  • 通过 StackExchange.Redis 连接到 Redis Servier

    我尝试使用以下方法制作一个测试项目Redis https redis io服务器 通过 Virtual Box 安装在 Linux Ubuntu 虚拟机上 Linux 机器通过 Virtual Box 的桥接适配器与本地网络连接 Virtu
  • 在 Kubernetes/Openshift 中将客户端-服务器流量保持在同一区域的最佳方法?

    我们运行兼容 Kubernetes OKD 3 11 的本地 私有云集群 其中后端应用程序与用作缓存和 K V 存储的低延迟 Redis 数据库进行通信 新的架构设计将在两个地理上分布的数据中心 区域 之间平均划分工作节点 我们可以假设节点
  • socket.io 广播功能 & Redis pub/sub 架构

    如果有人能帮助我解决一个小疑问 我将不胜感激 使用socket io广播功能和在Redis上使用pub sub设计架构有什么区别 例如 在另一个示例中 node js 服务器正在侦听 socket io 针对 键 模型 todo 和值 数据
  • Redis Docker compose无法处理RDB格式版本10

    我无法在 docker compose 文件中启动 redis 容器 我知道docker compose文件没问题 因为我的同事可以成功启动项目 我读到有一个删除 dump rdb 文件的解决方案 但我找不到它 我使用Windows机器 任
  • 有没有办法在 ruby​​ 中重新定义 []=+

    我正在尝试编写一个简单的 DSL 针对 Redis 并且我想自己定义 I have def key val redis zadd name val key end 我想定义 def key val redis zincrby name va
  • 如何在Redis中进行持久化存储?

    关闭redis服务器后 使用set存储的值被破坏 在这里我找到了使用持久性存储的方法 有人帮助我 如何使用javascript实现这一点 我想将客户端的一些值存储在 redis 数据库中 并且必须在其他客户端中使用该值 您需要配置 Redi
  • Redis发布/订阅:查看当前订阅了哪些频道

    我目前有兴趣查看我拥有的 Redis 发布 订阅应用程序中订阅了哪些频道 当客户端连接到我们的服务器时 我们将它们注册到如下所示的通道 user user id 这样做的原因是我希望能够看到谁 在线 目前 我在不知道客户端是否在线的情况下盲
  • 使用 Sentinels 升级 Redis 的最佳实践?

    我有 3 个 Redis 节点 由 3 个哨兵监视 我进行了搜索 文档似乎不清楚如何最好地升级此类配置 我目前使用的是 3 0 6 版本 我想升级到最新的 5 0 5 我对这方面的程序有几个疑问 升级两个大版本可以吗 我在我们的暂存环境中执
  • Java 将字节转换为二进制安全字符串

    我有一些以字节为单位的数据 我想将它们放入Redis中 但是Redis只接受二进制安全字符串 而我的数据有一些二进制非安全字节 那么如何将这些字节转换为二进制安全字符串以便将它们保存到 Redis 中呢 Base64 对我有用 但它使数据更
  • 在 Redis 上为 Django 和 Express.js 应用程序共享会话存储

    我想创建一个包含一些登录用户的 Django 应用程序 另一方面 由于我想要一些实时功能 所以我想使用 Express js 应用程序 现在的问题是 我不希望身份不明的用户访问 Express js 应用程序的日期 因此 我必须在 Expr
  • Scala 使用的 Redis 客户端库建议

    我正在计划使用 Scala 中的 Redis 实例进行一些工作 并正在寻找有关使用哪些客户端库的建议 理想情况下 如果存在一个好的库 我希望有一个为 Scala 而不是 Java 设计的库 但如果现在这是更好的方法 那么仅使用 Java 客

随机推荐

  • editplus配置python环境 和 php环境

    editplus配置python环境 和 php环境 使用editplus这么久 才知道是可以配置python环境 和 php环境 想来真丢人 这就是自学的痛苦之处 许多时如果不是自己突然想到 只会永远在黑暗中摸索 editplus配置py
  • KNN与CNN

    KNN与CNN相关 KNN K Nearest Neighbor 最邻近分类算法 就是k个最近的邻居的意思 说的是每个样本都可以用它最接近的k个邻居来代表 KNN算法的核心思想是如果一个样本在特征空间中的k个最相邻的样本中的大多数属于某一个
  • windows xp 驱动开发(三)DDK与WDK WDM的区别

    转自 http www cnblogs com hyddd archive 2009 03 15 1412684 html 最近尝试去了解WINDOWS下的驱动开发 现在总结一下最近看到的资料 1 首先 先从基础的东西说起 开发WINDOW
  • 第十四章 AlibabaCloud微服务下的链路追踪系统

    1 微服务架构下的排查问题复杂性概述 两个常 的问题 微服务调 链路出现了问题怎么快速排查 微服务调 链路耗时 怎么定位是哪个服务 链路追踪系统 分布式应 架构虽然满 了应 横向扩展的需求 但是运维和诊断的过程变得越来越复杂 例如会遇到接
  • linux 拷贝文件夹并覆盖另一个文件夹 cp指令

    参考 参考 https m runoob com linux linux comm cp html Linux cp 英文全拼 copy file 命令主要用于复制文件或目录 语法 cp options source dest 或 cp o
  • BoolQueryBuilder 和 wildcardQuery withFilter 查询

    一 BoolQueryBuilder查询说明 BoolQueryBuilder qb QueryBuilders boolQuery 1 返回的文档必须满足must子句的条件 并且参与计算分值 qb must QueryBuilder qu
  • 腾讯云数据库TDSQL:分布式数据库,你真的了解吗?

    分布式数据库进入人们的视野已经很久了 相对于传统的集中式数据库 分布式数据库在高性能 高可用 平滑拓展 高可靠 低成本等许多方面具有优势 但时至今日 关于分布式数据库 似乎一直缺少足够权威和客观的解读 现在 国家白皮书来了 为了明确分布式数
  • Vue SSR(vue服务端渲染)

    SSR的应用场景 1 SEO需求 SEO Search Engine Optimization 搜索引擎优化 是一种利用搜索引擎规则 提高网站在搜索引擎内自然排名的技术 通常这需要页面内容在页面加载完成时便已经存在 前后端分离的纯前端项目
  • ECCV 2022

    ECCV 2022 Learning Implicit Feature Alignment Function for Semantic Segmentation概述与代码分析 论文 https arxiv org abs 2206 0865
  • SPEED 飞车扩容改造:敢于对过去说不

    欢迎大家前往腾讯云社区 获取更多腾讯海量技术实践干货哦 作者 wincent 导语 敢于对过去的脚本说不 前言 QQ飞车作为一款竞速游戏 从08年至今十年光阴 依然坚挺 能运维一款这样的产品 非常的荣幸 压力和动力都是有的 有压力才有动力
  • 一段程序:SAP使用ODI方法为WORD填充数据

    未做测试 仅记备查 原文地址 http blog sina com cn s blog 3eefd36c01008cmz html 原理 通过 CALL METHOD DOCUMENT gt GET MAIL MERGE INTERFACE
  • Linux学习系列一:Linux的简单介绍以及命令行的基本操作

    这个系列的Linux教程主要参考刘遄老师的 Linux就该这么学 用的系统是RHEL8 如果遇见一些命令出现问题 请首先检查自己的系统是否一致 如果不一致 可网上查一下系统间某些命令之间的差异 目前设计的这个Linux学习系列的目录如下 会
  • 促进内容营销策略的 12 个 ChatGPT 技巧

    作为营销大亨 您可能并不陌生于创建脱颖而出并让您的读者着迷的内容的重要性 然而 集思广益 制作和编辑内容以及推广它可能是耗时 压倒性的 让我们面对现实吧 你宁愿外包它 或者至少得到一些帮助 你可能听说过它 实际上 谁没有听说过 但让我重新认
  • 2021年Linux技术总结(三):根文件系统(rootfs)

    一 根文件系统简介 Linux系统三大块 U boot kernel以及最后这个rootfs 跟文件系统 在kernel中 启动流程的最后会调用 prepare namespace 函数 挂载根文件系统 这里就是挂载的本篇要说的 根文件系统
  • You have mail in /var/spool/mail/root

    转载http www fedora hk linux yumwei show 17 html 安装完LINUX后经常使用终端远程登录 登录后经常出现You have new mail in var spool mail root的提示 很是
  • 如何在不卸载Revit插件的情况下禁用插件?

    如何在不卸载Revit插件的情况下禁用某个插件 这个问题对于Revit开发的朋友 不是问题 但对于Revit的终端用户 可能就无从下手 解决此问题的答案就是禁用插件的 addin文件 Revit的插件注册方式之一就是通过 addin文件 我
  • 图书系统相关代码

    import java util Objects import java util Scanner Author Ben Date 2020 10 29 13 32 public class Test3 图书馆接口 Library 成员方法
  • python修改voc格式数据集的xml文件的name标签(class_label)

    import os path import xml dom minidom import xml etree ElementTree as ET path D yolov4 tiny pytorch master yolov4 tiny p
  • SurfaceView和普通view的区别及简单使用

    1 SurfaceView介绍 SurfaceView第一印象它是一个view 因为它继承了View 有两个直接子类GLSurfaceView VideoView 但根据SDK文档SurfaceView和普通的view又有较大区别 最显著的
  • redis持久化-归纳

    部分参考地址 较详细 https baijiahao baidu com s id 1654694618189745916 简明扼要 https blog csdn net qq 39291929 article details 10343