Redis——持久化数据

2023-11-18

        Redis被称为是内存数据库,那是因为它会将其所有数据存储在内存里,因此Redis具有强劲的速度性能,但是,也正因为数据存储在内存中,当Redis重启后,所有存储在内存的数据就会丢失。为了使得数据持久化,Redis提供了两种方式:RDB方式AOF方式

一、RDB方式

        RDB方式的持久化是通过快照(snapshotting)完成的,当符合一定条件时,Redis会自动将内存中所有的数据生成一份副本并存储在硬盘中,这个过程被称为“快照”。“快照”,就类似于拍照,摁下快门那一刻,所定格的照片,就称为“快照”。Redis有4种情况会对数据进行快照:

  • 根据配置规则进行自动快照;
  • 用户执行SAVE或BGSAVE命令;
  • 执行FLUSHALL命令;
  • 执行复制(replication)时。

1、根据配置规则进行自动快照

        配置文件的自定义信息由两个参数决定:时间窗口M改动的键的个数

如配置:save 900 1

可以配置多个快照条件,每条快照条件都占一行,并且以save开头,上面这条表示900秒内有一个或一个以上的键被修改了,就进行快照。

2、用户执行SAVE或BGSAVE命令

        在执行SAVE命令进行手动快照时,快照过程中会阻塞所有来自客户端的请求,当数据库数据比较多时,那么这一过程就会使得客户端等待较长的时间;相对的,执行BGSAVE命令时,则是采用异步快照,在进行快照过程中,依然响应来自客户端的请求。所以,比较常用的是BGSAVE命令。

3、执行FLUSHALL命令

        当执行FLUSHALL命令时,Redis会清除数据库的所有数据。值得注意的是,清空数据库过程,相当于修改键,在这个过程中,只要自动快照条件不为空,Redis都会执行一次快照,换句话说,如果没有定义自动快照条件时,即使执行了FLUSHALL命令,也不会进行快照。

4、执行复制(replication)

    当设置了主从模式时,Redis会在复制初始化时进行自动快照。这里跟FLUSHALL有区别,执行复制时,即使没有设置自动快照条件,也会进行快照操作,生成RDB格式文件。

快照原理:

        Redis默认会将快照文件存储在Redis当前进程的工作目录中的dump.rdb文件中,可以配置 dir和dbfilename两个参数设置快照文件路径。快照过程

(1) Redis使用fork函数复制一份当前进程的副本;

(2) 父进程(这里是当前进程)继续接收并处理客户端发来的命令,而子进程(副本)开始将内存中的数据写入硬盘中临时文件;

(3) 当子进程写完所有数据后,就用临时文件覆盖掉就掉RDB文件,至此,完成一次快照操作。

        在fork函数执行的时候,操作系统会使用写时复制(copy-on-write)策略,即fork函数发生的那一刻,父子进程共享同一内存数据,当父进程要更改其中某片数据时,操作系统会将该片数据复制一份,以保证子进程不受影响,所以新的RDB格式文件保存的是执行fork那一刻的内存数据。因为使用了写时复制策略,使得在fork的时刻用了不到2倍的内存,就可以保存貌似两份的内存副本一样。

        值得注意的是,当进行快照的过程中,如果写入操作较多,造成fork前后数据差异较大,是会使得内存使用量显著增加,因为内存中不仅保存当前进程的数据,还保存了fork时刻的内存数据。

        Redis进行快照的过程中不会修改RDB文件,只有快照结束后才会将旧的文件替换成新的,也就是说任何时候RDB文件都是完整的,这对于数据库备份有一个很好的作用。

二、AOF方式

        通过RDB方式实现持久化,一旦Redis异常退出,,就会丢失最后一次快照之后更改的所有数据。为了降低因进程中止导致的数据丢失风险,可以使用AOF方式实现数据持久化。

        默认情况下,Redis是没有开启AOF方式的持久化,可以通过appendonly参数启动:appendonly yes

        开启AOF持久化后,每执行一条会更改Redis中数据的命令,Redis就会将该命令写入硬盘中的AOF格式的文件,即.aof格式文件存储的是一些redis指令。这个时候就要注意,当频繁操作Redis中的数据时,AOF格式文件所占内存就会越来越大,而且会有很多没用的指令,如连续执行set foo 1,set foo 2,set foo 3,那么前两条指令是没有意义的,Redis很强大,它会自动将没有意义的指令删除,即每当达到一定条件时,Redis就会自动重写AOF文件,而这个条件可以在配置文件中设置。重写的过程只和内存数据有关,和之前的AOF文件无关,这点跟RDB相似。

        在同步硬盘数据数据时,由于操作系统的缓存机制,数据并没有真正地写入到硬盘中,而是进入到系统的硬盘缓存。在默认的情况下,系统每个30秒会执行一次同步操作,在这30秒的过程中,如果系统异常退出,那么会导致硬盘内存中的数据丢失。Redis允许同时开启RDB和AOF方式,既保证了数据安全,又使得备份操作十分容易。AOF可以有效降低数据丢失的可能性,RDB可以使得数据备份容易达到。

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

Redis——持久化数据 的相关文章

  • 如何测试我的 Redis 缓存是否正常工作?

    我已经安装了 django redis cache 和 redis py 我遵循了 Django 的缓存文档 据我所知 以下设置就是我所需要的 但我如何判断它是否正常工作 设置 py CACHES default BACKEND redis
  • 在 Kubernetes/Openshift 中将客户端-服务器流量保持在同一区域的最佳方法?

    我们运行兼容 Kubernetes OKD 3 11 的本地 私有云集群 其中后端应用程序与用作缓存和 K V 存储的低延迟 Redis 数据库进行通信 新的架构设计将在两个地理上分布的数据中心 区域 之间平均划分工作节点 我们可以假设节点
  • 有没有办法在 ruby​​ 中重新定义 []=+

    我正在尝试编写一个简单的 DSL 针对 Redis 并且我想自己定义 I have def key val redis zadd name val key end 我想定义 def key val redis zincrby name va
  • 如何设置和获取Redis中存储的对象?

    我试图在 redis 中存储一个对象 当我获取该对象时 它似乎不起作用 I tried u User new u name blankman redis set test u x redis get test x name error 我想
  • Lua中按字符分割字符串

    我有像这样的字符串 ABC DEF 我需要将它们分开 字符并将两个部分分别分配给一个变量 在 Ruby 中 我会这样做 a b ABC DEF split 显然Lua没有这么简单的方法 经过一番挖掘后 我找不到一种简短的方法来实现我所追求的
  • 使用 Sentinels 升级 Redis 的最佳实践?

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

    我有一些以字节为单位的数据 我想将它们放入Redis中 但是Redis只接受二进制安全字符串 而我的数据有一些二进制非安全字节 那么如何将这些字节转换为二进制安全字符串以便将它们保存到 Redis 中呢 Base64 对我有用 但它使数据更
  • StackExchange.Redis Get 函数抛出 TimeoutException

    我在用着StackExchange Redis与 C 和StackExchangeRedisCacheClient Get函数抛出以下异常 myCacheClient Database StringGet txtKey Text myCac
  • 如何在Redis中只保存一个数据库?

    我是 Redis 新手 有一个与备份相关的问题 目前 我有一个实例在 Windows 服务器上运行 在这个实例中 我当前有一项 工作 将数据存储在一个数据库中 我不想备份这些数据 我必须创造一份新工作 我的第一个想法是将数据存储在另一个数据
  • 如何使用redis发布/订阅

    目前我正在使用node js和redis来构建应用程序 我使用redis的原因是因为发布 订阅功能 该应用程序只是在用户进入用户或离开房间时通知经理 function publishMsg channel mssage redisClien
  • 如何配置Lettuce Redis集群异步连接池

    我正在配置我的生菜重新分配池 当我按照官方文档配置时 连接池无法正常初始化 无法获取连接 官方文档指出 RedisClusterClient clusterClient RedisClusterClient create RedisURI
  • 超出 Redis 连接/缓冲区大小限制

    在对我们的应用程序服务器进行压力测试时 我们从 Redis 中得到以下异常 ServiceStack Redis RedisException 无法连接到 redis host 6379 处的 redis 实例 gt System Net
  • 使用环境变量在 redis.conf 中设置动态路径

    我有一个环境变量MY HOME其中有一个目录的路径 home abc 现在 我有一个redis conf文件 我需要像这样设置这个路径 redis conf pidfile MY HOME local var pids redis pid
  • Redis 在键过期时更新排序集

    我有一个 Redis 服务器 其中包含一组键值对和一个排序集 提供这些键值对的键的索引 键值对可以进入 已完成 状态 此时需要在 1 小时后删除它们 这可以通过在键上设置到期时间来简单地实现 但从排序集中清除它们似乎更成问题 我可以有一个过
  • 没有适用于机器人的 Laravel 会话

    我在大型 Laravel 项目和 Redis 存储方面遇到问题 我们将会话存储在 Redis 中 我们已经有 28GB 的 RAM 然而 它的运行速度仍然相对较快 达到了极限 因为我们有来自搜索引擎机器人的大量点击 每天超过 250 000
  • 批量将Dictionary中的数据设置到Redis中

    我正在使用 StackExchange Redis DB 插入键值对字典Batch如下 private static StackExchange Redis IDatabase database public void SetAll
  • 使用通配符查找键

    我已经使用分号保存了数据 redis gt keys party 1 party congress president 2 party bjp president 3 party bjp 4 party sena 是否有任何命令可以列出所有
  • redis.exceptions.ConnectionError:连接到本地主机时出现错误-2:6379。名称或服务未知

    当我在服务器中运行代码时出现此错误 我的环境是 debian 并且Python2 7 3 Traceback most recent call last File fetcher py line 4 in
  • memcache、redis 和 ehcache 作为分布式缓存框架的比较 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我需要做出的决定之一是在我的系统中使用什么缓存框架 有这么多可供选择 我目前正在研究 redis ehcache 和 memcached
  • Redis 客户端忽略其上设置的配置选项并尝试连接到默认 IP 127.0.01

    在AWS中 我使用ElastiCache Redis服务器并使用节点作为后端和 promise redis 包 这就是我尝试连接到我的 redis 服务器端点的方法 client redis createClient host my red

随机推荐

  • 为什么Precision高Recall就低——F1 score

    梳理一下公式 sensitivity recall Precision和Recall虽然从计算公式来看并没有什么必然的相关性关系 但是 在大规模数据集合中 这2个指标往往是相互制约的 理想情况下做到两个指标都高当然最好 但一般情况下 Pre
  • 什么是护网(HVV)?需要什么技能?

    HVV介绍 1 什么是护网 护网的定义是以国家组织组织事业单位 国企单位 名企单位等开展攻防两方的网络安全演习 进攻方一个月内采取不限方式对防守方展开进攻 不管任何手段只要攻破防守方的网络并且留下标记即成功 直接冲到防守方的办公大楼 然后物
  • git软件代码提交详解

    git提交代码流程 git提交代码时 不能把代码直接提交到master分支 需要切换到一个子分支 然后把要提交的代码上传到子分支 然后将子分支合并到master分支上 提交步骤 1 创建并切换到子分支 git checkout b 子分支名
  • Linux软硬链接的区别

    1 概念 软链接 软链接又叫符号链接 这个文件包含了另一个文件的路径名 可以是任意文件或目录 可以链接不同文件系统的文件 硬链接 就是一个文件的一个或多个文件名 硬链接就是让多个不在或者同在一个目录下的文件名 同时能够修改同一个文件 其中一
  • 16.odoo入门——初探后台启动过程(三)

    第16天 终于周五 迎来难得的双休 上次说到 运行如下代码 rc odoo service server start preload preload stop stop 又调用了odoo service server py下的start函数
  • ssh命令,key认证

    1 sshd简介 当主机中开启openssh服务 那么就对外开放了远程连接的接口 openssh服务的服务端 开元的远程连接 sshd secure shell 服务端软件 对外开放一个接口 让别人通过其他途径连接可以通过网络在主机中开机s
  • Jean-Pierre Merlet 教授的并联机器人研究

    Jean Pierre Merlet是法国国家信息与自动化研究所 INRIA 的高级科研人员 严格来说不是教授 其著作 Parallel Robots 是并联机器人领域的经典教材 自1986年在巴黎第六大学获得博士学位后 他长期从事并联机器
  • SHA-3算法学习笔记——day1_算法简介。

    由于种种原因 对kyber算法的学习需要终止一阶段呜呜呜 现阶段学习SHA 3杂凑算法 SHA 3算法的优化等问题后续不知道还要不要学习 先学该算法的基本结构吧 SHA 3算法是一种杂凑算法 其涉及到的数学专业知识不多 结构也相对简单 轮运
  • WIN10局域网共享方法

    1 控制面板 网络和 Internet 网络和共享中心 高级共享设置 打开启动网络发现 启动文件共享和打印机共享 2 win r运行gpedit msc 打开本地组策略编辑器 找到 计算机配置 管理模板 网络 Lanman工作站 启动不安全
  • Mybatis学习笔记(一)

    MyBatis学习笔记 1 Mybatis 开源免费框架 以前叫ibatis 2010年在google code 2013年迁移到git tub 2 作用 数据访问层框架 2 1底层是对jdbc的封装 3 mybatis优点 使用mybat
  • 什么是Odoo ERP:部署方式、业务集成、成本投入、发展与未来

    ERP部署的类型 如何部署ERP 系统 通过多年的发展 ERP系统的部署方式更加多样化 包括公有云或私有云部署 本地部署或整合不同环境的混合部署场景 企业可根据自身条件与应用场景加以选择 下面介绍了每种部署模式的主要优势 旨在帮助你选择最合
  • 这份4577页的Java面试PDF,让我成功斩获阿里、字节等大厂offer

    我为大家准备了一份超级全面的Java 学习面试笔记 这份电子版笔记涵盖了诸多后端技术栈的面试题和答案 相信可以帮助大家在最短的时间内复习Java后端的大多数技术点和面试题 从而拿到自己心仪的offer 共4577页 整体还是比较清爽的 大家
  • 使用python中的随机森林进行数据分类预测

    以下是使用Python中的随机森林进行数据分类预测的示例代码 引入需要的库 from sklearn ensemble import RandomForestClassifier from sklearn model selection i
  • 利用百度AI 合成语音2

    文字合成语音 coding UTF 8 from aip import AipSpeech from playsound import playsound 你的 APPID AK SK APP ID 20232679 API KEY bZc
  • HEVC原理-图像的二维变换与离散余弦变换(DCT)

    最近在做RDOQ算法优化和硬件系统结构设计 建立其时序模型 估算算法的硬件复杂度 在做这部分工作的同时 博主学习了图像的二维变换与离散余弦变换 DCT 总结如下 1 图像的二维离散变换 与一维的有限长离散非周期信号存在傅里叶变换 DFT 一
  • properties文件快速转为yml文件

    只是做了简单的测试 没有考虑过文件里有注释的情况 思想就是先把数据读到map中 然后再保存到新的文件中 public class Test public static void main String args throws Excepti
  • C++ 0x 之移动语义和传导模板实现原理

    文 李博 光宇广贞 C 0x 之左值与右值 文中提到 std forward 和 std move 本文开头对之补充一句 在操作函数返回值或函数参数时 匿名左值仍然为左值 左值可以具名 匿名右值仍然为右值 右值一旦具名成功 立即转变为左值
  • Fping命令解析

    Fping程序类似于ping ping是通过ICMP 网络控制信息协议InternetControl Message Protocol 协议回复请求以检测主机是否存在 Fping与ping不同的地方在于 fping可以在命令行中指定要pin
  • QT_内存

    深度解析QMap与QHash 转载于 http www cnblogs com 5iedu p 5835715 html
  • Redis——持久化数据

    Redis被称为是内存数据库 那是因为它会将其所有数据存储在内存里 因此Redis具有强劲的速度性能 但是 也正因为数据存储在内存中 当Redis重启后 所有存储在内存的数据就会丢失 为了使得数据持久化 Redis提供了两种方式 RDB方式