小白学Redis系列:Redis持久化

2023-11-19

    Redis作为缓存数据库,区别于常规数据库的地方就在于Redis将数据存储在内存中,而不是硬盘中,因此数据的IO就十分快速,非常适合一些电商网站等数据IO频繁的场景。当然,内存中的数据在掉电之后就会被清空,而Redis的持久化功能使得内存中的数据能够以某种形式保存到硬盘中,当Redis重启时会自动从硬盘中恢复数据,从而保证数据不丢失。

     Redis的持久化方式有两种:

  • RDB方式
  • AOF方式

方式一:RDB方式

    RDB方式的持久化是通过快照完成的,当满足一定条件时,Redis会将内存中所有数据生成一份副本并存储在硬盘中,这个过程就称为快照。
Redis默认会将快照文件存储在Redis当前进程的工作目录的dump.rdb文件中,可以配置dir和dbfilename参数设定快照文件的存储路径以及文件名。以下几种情况会触发快照:
  • 根据配置文件中的条件执行快照
Redis允许用户在配置文件中自定义快照条件,有两个参数构成,一个是时间窗口M(单位为秒),另一个是改动的键的个数N,每当时间M内被更改的键的个数大于N个时,就触发快照动作例如:
save 900 1

save  300   10

每条快照条件占一行,以save参数开头,它们之间是"或"的关系。

  • 执行SAVE或BGSAVE命令

      处理上述Redis自动执行快照之外,有些情况需要我们手动去执行快照,例如进行服务重启,数据迁移等情况。Redis提供了两个命令来完成这一任务:

  1. SAVE命令:当执行SAVE命令时,Redis会同步的执行快照, 执行快照的过程 中会阻塞所有客户端的请求,因此当数据量较大时,Redis可能会出现长时间不响应的情况,因此生产环境应尽量避免使用SAVE命令。
  2. BGSAVE命令:当需要手动执行快照时推荐使用BGSAVE命令,BGSAVE命令可以在后台异步地执行快照动作,而快照的同事Redis服务端还能处理客户端的请求。

  • 执行FLUSHALL命令

      当执行FLUSHALL命令时,会清空Redis内存中的所有数据,但与此同时,无论清空的过程中是否触发了快照条件,只要自动快照的条件不为空,Redis就会执行一个快照动作。当没有定义快照条件时,执行FLUSHALL命令是不会触发快照动作的。

  • 复制初始化阶段

    当Redis以主从模式部署时,在复制初始化阶段,从数据库会向主数据库发送SYNC命令,触发主数据库执行一次快照动作。Redis复制的详细过程将在下一篇系列文中讲到。


    上述4种情况都会触发Redis的快照动作,但需要区分的是,除了执行SAVE命令触发的快照动作是同步的,其他方式的快照都是异步快照。下面简单阐述一下异步快照的过程:

  1. Redis使用fork函数复制一份当前进程(父进程)的副本(子进程)
  2. 父进程继续接收并处理客户端的请求,而子进程开始将内存中数据写入硬盘的临时文件
  3. 当子进程完成所有数据地写入后,会用该临时文件替换旧的RDB文件,至此一次快照动作就完成了

    需要注意的是,新的RDB文件存储的是fork函数执行那一刻的内存数据,父进程后续处理的写操作所影响的数据不会被记录新的RDB文件中,因此异步快照可能会丢失一部分数据


方式二:AOF方式

    默认情况下,Redis并没有开启AOF持久化,可以配置appendonly参数设置为yes开启。AOF文件保存位置可以通过dir选项设置,默认文件名为appendonly.aof,可以通过appendfilename选项设置。

    开启AOF持久化后,Redis每执行一条会更改内存数据的命令,就会将该命令写入硬盘中的AOF文件中,因此AOF文件中存储的不是内存中的数据,而是命令。Redis启动时,会逐条执行AOF文件中的每一条命令,因此相对于加载RDB文件来说,启动时间可能会相对较长,但AOF方式更能够保持数据的完整性。

    实际上,受操作系统的影响,Redis并不是真正地每执行一条写命令,都立即地实时地将该命令持久化到硬盘中,而是写入了硬盘缓存中,默认情况下,每30秒操作系统就会 执行一个同步操作,这是缓存中的数据才真正的持久化到硬盘中了。

    但30秒时间相对较长,这期间若系统出现异常,则有可能导致数据丢失,这当然是Redis不能容忍的。Redis允许用户在配置文件中设置appendfsync选项指定同步的时机。appendfsync选项有三个可选值:

always :实时写入到硬盘中,数据安全性最高但影响系统性能

everysec : 默认值,每秒执行一次同步

no : 不主动同步,交由系统完成,即30秒执行一次同步

    Redis允许同时开启AOF和RDB这两种模式,这种情况下,Redis启动时会加载AOF文件来恢复数据,因为AOF方式可能丢失更少的数据。


Ending ... 大笑

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

小白学Redis系列:Redis持久化 的相关文章

  • 如何在实时添加对象时从 Redis 中弹出对象?

    我想让 Node js 进程运行 因为它正在检查 Redis 服务器是否有任何新的弹出内容 另一个进程将偶尔进行推送 而 Node 进程将尝试弹出任何进来的内容 Node 进程将保持运行 有人能给我指出一个好的方向吗 我正在尝试找出如何监听
  • 使用 sidekiq 处理两个独立的 Redis 实例?

    下午好 我有两个独立但相关的应用程序 他们都应该有自己的后台队列 阅读 单独的 Sidekiq 和 Redis 进程 然而 我希望偶尔能够将工作推给app2的队列来自app1 从简单的队列 推送的角度来看 如果app1没有现有的 Sidek
  • Redis部署配置-主从复制

    目前我有两台服务器 我已经部署了基于node js Express JS的Web服务API 我正在使用 Redis 来缓存 JSON 字符串 将此设置部署到生产中的最佳选择是什么 我懂了here https stackoverflow co
  • 如何在多个Lua State(多线程)之间传递数据?

    我在中启动Redis连接池redis lua 通过从 C 调用 我得到了redis lua state 此 Lua 状态全局启动一次 仅在其他线程中启动get从中 当有一个 HTTP 请求 工作线程 时 我需要从redis lua stat
  • 如何在节点redis客户端上设置读取超时?

    在 github 上我没有看到读取超时的选项 https github com NodeRedis node redis https github com NodeRedis node redis There s connect timeo
  • WSL Redis 遇到系统尚未使用 systemd 作为 init 系统(PID 1)启动。无法操作[已关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我正在尝试遵循本文中讨论的 Redis 安装过程article https www digitalocean com community
  • 是否有可嵌入的 Java 替代 Redis?

    根据这个线程 https stackoverflow com questions 3047010 best redis library for java 如果我想从Java中使用Redis Jedis是最好的选择 然而 我想知道是否有任何库
  • Redis 排序集和解决关系

    我正在使用 Redis 排序集来存储我正在处理的项目的排名 我们没有预料到 我们想要如何处理关系 Redis 按字典顺序对具有相同分数的条目进行排序 但我们想要做的是对具有相同分数的所有条目给予相同的排名 例如在以下情况 redis 127
  • 如何批量删除Redis中数十万个带有特殊字符的key

    我们有一个包含数十万个 Redis 键的列表 其中包含各种特殊字符 我们希望批量删除它们 对于这个问题上的类似问题 有一些很好的答案 如何使用 Redis 自动删除与模式匹配的键 https stackoverflow com questi
  • 如何将 ActionController::Live 与 Resque + Redis 一起使用(用于聊天应用程序)

    我正在尝试为我的 Rails 应用程序构建聊天功能 我在用ActionController Live Puma Resque Redis为了这 所以基本上在这种情况下 redissubscribe方法正在后台运行 使用resque 到目前为
  • 通过 StackExchange.Redis 连接到 Redis Servier

    我尝试使用以下方法制作一个测试项目Redis https redis io服务器 通过 Virtual Box 安装在 Linux Ubuntu 虚拟机上 Linux 机器通过 Virtual Box 的桥接适配器与本地网络连接 Virtu
  • 使用 Redis 命令 incr 和 expire 时的竞争条件

    根据redis文档 http redis io commands incr http redis io commands incr 在段落模式 速率限制器 2 较短的版本代码 value INCR ip IF value 1 THEN EX
  • Redis发布/订阅:查看当前订阅了哪些频道

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

    我有 3 个 Redis 节点 由 3 个哨兵监视 我进行了搜索 文档似乎不清楚如何最好地升级此类配置 我目前使用的是 3 0 6 版本 我想升级到最新的 5 0 5 我对这方面的程序有几个疑问 升级两个大版本可以吗 我在我们的暂存环境中执
  • Laravel 所有会话 ID 与 Redis 驱动程序

    在我的应用程序中 我希望允许某些用户能够注销除他 她之外的所有其他用户 当会话驱动程序设置为文件时 我已经完成了此功能 但现在我使用 redis 作为会话驱动程序 并且我无法找到任何方法来列出所有当前会话 就像我在文件时所做的那样司机 问题
  • redis - 使用哈希

    我正在使用 redis 为我的 Web 应用程序实现社交流和通知系统 我是 redis 的新手 我对哈希值及其效率有一些疑问 我读过这篇很棒的文章Instagram 帖子 http instagram engineering tumblr
  • 有没有办法让特定的key在集群模式下定位到特定的redis实例上?

    我想让我的多锁位于不同的redis实例上 我发现redission可以指定一个实例来执行命令 但是如果该命令与key相关 则指定的实例会将命令传输到另一个实例 你能给我一些建议吗 你可以 但这并不是微不足道的 首先 Redis 在键中使用大
  • 如何使 Redis 缓存中数据层次结构(树)的部分内容无效

    我有一些产品数据 需要在 Redis 缓存中存储多个版本 数据由 JSON 序列化对象组成 获取普通 基本 数据的过程很昂贵 将其定制为不同版本的过程也很昂贵 因此我想缓存所有版本以尽可能进行优化 数据结构看起来像这样 BaseProduc
  • 为什么Redis中没有有序的hashmap?

    Redis 数据类型 http redis io topics data types包括排序集 http redis io topics data types intro sorted sets以及其他用于键值存储的必要数据结构 但我想知道
  • 想要在后台不间断地运行redis-server

    我已经下载了 redis 2 6 16 tar gz 文件并安装成功 安装后我运行 src redis server 它工作正常 但我不想每次都手动运行 src redis server 而是希望 redis server 作为后台进程持续

随机推荐

  • 在命令行运行 VSCode(macOS)

    在命令行运行 VSCode macOS系统 Windows 版 VSCode 的安装脚本带着一个是否把 Code 加入 PATH 的选项 而 macOS版却没有 有的人想到给 VSCode 做一个符号链接加入 PATH 中 但实际上这样做会
  • IBM power小型机HMC管理口默认IP地址和ASMI默认密码

    IBM硬件管理控制台 Hardware Management Console 提供了标准的用户接口来配置和管理Power System系列服务器以及服务器上的分区 通过HMC软件可以管理服务器 POWER5 HMC控制地址 192 168
  • HCIP——BGP第一天实验

    一 实验要求 除R5的5 5 5 0环回外 其他所有环回均可互相访问 二 实验拓扑 三 实验过程 1 配置IP地址 R1 r1 int g0 0 1 r1 GigabitEthernet0 0 1 ip add 12 1 1 1 24 r1
  • STM32 电机教程 29 - 无刷无感入门1

    前言 无刷直流 Brushless Direct Current BLDC 电机是一种正快速普及的电机类型 它可在家用电器 汽车 航空航天 消费品 医疗 工业自动化设备和仪器等行业中使用 正如名称指出的那样 BLDC 电机不用电刷来换向 而
  • uvm的config_db

    config db 是用于在各个uvm对象里传递参数 一般参数类型 是interface int等 据说参数必须是静态类型 这个可以在uvm config db相关代码里确认 后来知道 config db还能设置sequence和seque
  • C#如何从数据库SQLServer中同时读取多个结果集

    当需要从数据库中同时读取多个结果集时 比如执行如下的sql语句 select from tblClass select from tblStudent 同时从两个表格中获取结果 会获取两个结果集 此时需要使用SqlDataReader对象的
  • vue使用threejs加载模型问题整理

    1 如果出现错误 THREE WebGLRenderer Error creating WebGL context 需要开启浏览器的gpu加速 GPU acceleration 地址栏输入 chrome flags ignore gpu b
  • 国考省考申论:归纳概括多个主体身上的优秀品质,透过动词现象(怎么做的),找到名词(精神品质)本质

    国考省考申论 归纳概括多个主体身上的优秀品质 透过动词现象 怎么做的 找到名词 精神品质 本质 2022找工作是学历 能力和运气的超强结合体 公务员特招重点就是专业技能 附带行测和申论 而常规国考省考最重要的还是申论和行测 所以大家认真准备
  • dede:list分页与控制文章标题显示字数

    关于dedecms分页 百度上也有许多教程 本人记性不好所以写个博客保存下来 pagesize控制每页显示条数 在 dede list 结束标签 后边写上 dede pagelist 标签即可 如何控制文章显示字 让溢出部分用 代替呢 其实
  • IPS与防火墙旁路部署

    一 防火墙旁路部署 实现防护功能的同时 可以完全不需改变用户的网络环境 并且可以避免设备对用户网络造成中断的风险 用于把设备接在交换机的镜像口或者接在 HUB 上 保证外网用户访问服务器的数据经过此交换机 并且设置镜像口的时候需要同时镜像上
  • iview+page封装+强制刷新

    前言 iview的page封装 缺点无法固定页码按钮数量 而且current的页面恢复选中第一个实现不了 这里动态写了强制刷新的方法 下面是组件cpage vue
  • 【Spring

    上篇 Spring 事件监听概述 对 Spring 事件监听的机制有了个基本的了解 本篇来详细的解读下Spring 的 事件监听机制 事件监听详解 ApplicationEvent ApplicationListener 基于注释 异步 排
  • 多态的实现

    多态 之前介绍过多态的概念就是基类引用派生类对象且和派生类有相同的同名覆盖函数 那么现在我们就具体讲讲怎么实现多态 类方法实现多态性有两种方法 1 方法重载 可以声明多个同名但参数个数 类型 和顺序不同的方法 编译时根据参数 个数 类型和顺
  • win环境下SSH key 配置

    从Gitlab上拉取代码报错 Warning Permanently added gitlab wang cn 47 94 8 13 ECDSA to the list of known hosts Connection closed by
  • windows下使用FFmpeg生成YUV视频文件并播放(通过命令的方式)

    一 YUV的定义 YUV是一种颜色编码方法 它跟我们常见的RGB格式区分开来 常使用在各个视频处理组件中 其中 Y 代表明亮度 U 和 V 代表其色度 视频播放器把市面上流行的MP4等格式文件的视频部分解码出来 得到的一般会是YUV格式的数
  • Java方法重写注意事项

    系原创 只为需要它的人 Java方法重写的几个要求 重写的方法与父类方法签名 方法名称和参数列表 相同 子类重写的方法访问修饰符范围不能低于父类 父类的私有方法不能被重写 static修饰的方法不能被重写 返回值类型 如果父类中方法返回值类
  • 解决mybatis一对多只能获取部分数据的问题

    需求 building表和position表 Building类中含有List positionList mybatis查询方法需要查询到所有的building和building中含有所有的position 问题 sql语句和一对多方法写的
  • SQL如何进行优化

    SQL优化 前言 对于初级程序开发工程师而言 SQL是很多人的弱项 为此我给大家来做一下总结 希望能够帮到你们 课程说明 1 对MySQL SQL优化方案做讲解 学习如何排查慢查询 SQL优化 分页查询优化 一页一页的往下面翻这种查询方式
  • 针对读写操作频繁的应用系统的LINUX调优设置

    在线签约系统调优 项目类型 限制型应用 需要频繁调用 进行签章 调用的 保存在 磁盘中 项目业务设计实现 这里简要说明一下业务流程 前端业务系统过来的请求通过Nignx进行分流 通过网关DSS 将各自的请求转发到相应的老 新签章系统进行处理
  • 小白学Redis系列:Redis持久化

    Redis作为缓存数据库 区别于常规数据库的地方就在于Redis将数据存储在内存中 而不是硬盘中 因此数据的IO就十分快速 非常适合一些电商网站等数据IO频繁的场景 当然 内存中的数据在掉电之后就会被清空 而Redis的持久化功能使得内存中