iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >为什么断电后Redis数据不会丢失
  • 884
分享到

为什么断电后Redis数据不会丢失

2024-04-02 19:04:59 884人浏览 独家记忆
摘要

目录前言Redis 持久化机制RDB 持久化机制RDB 机制触发条件自动触发RDB 机制相关配置文件RDB 机制优点RDB 机制缺点AOF 持久化机制AOF 机制如何开启AOF 机制

前言

Redis 作为一款内存数据库,被广泛使用于缓存分布式等场景,那么假如断电或者因其他因素导致 Reids 服务宕机,在重启之后数据会丢失吗?

Redis 持久化机制

Redis 虽然是定义为一个内存数据库,但是其也支持数据的持久化,在 Redis 中提供了两种持久化机制:RDB 持久化和 AOF 持久化。

RDB 持久化机制

RDB 全称为:Redis DataBase,是 Redis 当中默认的持久化方案。当触发持久化条件时,Redis 默认会生成一个 dump.rdb 文件,Redis 在重启的时候就会通过解析 dump.rdb 文件进行数据恢复。

RDB 机制触发条件

RDB 持久化机制有两种触发方式:自动触发和手动触发。

自动触发

自动触发方式也可以分为三种:

  • 执行 flushall 命令(flushdb 命令不会触发)时,不过此时生成的 dump 文件内的数据是空的(dump 文件还会存储一些头信息,所以文件本身是有内容的,只是没有数据),没有什么太大的实际意义。
  • 执行 shutdown 命令时会触发生成 dump 文件。
  • 通过配置文件自动生成,Redis 中配置文件默认配置如下,只要达到这三个条件中的任意一个,就会触发 RedisRDB 持久化机制。

save 900 1 //900秒内至少有1个key被添加或者更新
save 300 10 //300秒内至少有10个key被添加或者更新
save 60 10000 //60秒内至少有10000个key被添加或者更新

手动触发

除了自动触发,Redis 中还提供了 2 个手动触发 RDB 机制的命令(这两个命令不能同时被执行,一旦一个命令正在执行中,另一个命令会被拒绝执行):

  • save:这个命令会阻塞 Redis 服务器进程,直到成功创建 RDB 文件,也就是说在生成 RDB 文件之前,服务器不能处理客户端发送的任何命令。
  • bgsave:父进程会执行 fork 操作来创建一个子进程。RDB 文件由子进程来负责生成,父进程可以正常处理客户端发送的命令(这里也是 Redis 不仅仅只是单线程的一个体现)。

如果想要知道上一次成功执行 save 或者 bgsave 命令的时间,可以执行 lastsave 命令进行查看,lastsave 命令返回的是一个 unix 时间戳。

RDB 机制相关配置文件

除了上面提到的触发生成 rdb 文件的配置参数,RDB 持久化机制还有如下一些相关命令:

dirrdb 文件生成目录。默认是 ./(当前目录),可以执行命令 config get dir 进行查看,如下图所示说明当前 dump 文件生成目录为 /usr/local/redis-5.0.5/bin

在这里插入图片描述

dbfilenamerdb 文件名。默认是 dump.rdb

rdbcompressionrdb 文件是否是 LZF 压缩文件。默认是 yes

rdbchecksum:是否开启数据校验。默认是 yes

RDB 机制优点

  • RDB 是一个非常紧凑的压缩文件,保存了不同时间点上的文件,非常适合用来灾备和数据恢复。
  • RDB 最大限度地提高了 Redis 的性能,因为 Redis 父进程需要做的唯一的工作就是派生一个子进程来完成剩下的工作,父进程永远不会执行磁盘 I/O 或类似的耗时操作。
  • 与后面介绍的 AOF 持久化机制比较,RDB 方式恢复数据的速度更快。

RDB 机制缺点

  • RDB 无法做到实时备份,所以如果 Redis 因异常停止工作而没有正确的关机,那么从上一次备份的到异常宕机的这一段时间的数据将会丢失。
  • RDB 通常需要父进程来执行 fork 操作创建子线程,所以如果频繁执行 fork 操作而 CPU 性能又不是很高的话可能会造成短时间内父进程不可用。

AOF 持久化机制

AOF 全称为:Append Only File,是 Redis 当中提供的另一种持久化机制。AOF 采用日志的形式将每个写操作追加到文件中。开启 AOF 机制后,只要执行更改 Redis 数据的命令时,命令就会被写入到 AOF 文件中。在 Redis 重启的时候会根据日志内容依次执行 AOF 文件中的命令来恢复数据。

AOFRDB 最大的不同是:AOF 记录的是执行命令(类似于 Mysqlbinlogstatement 格式),而RDB 记录的是数据(类似于 mysqlbinlogrow 格式)。

需要注意的是:假如同时开启了 RDBAOF 两种机制,那么 Redis 会优先选择 AOF 持久化文件来进行数据恢复。

AOF 机制如何开启

AOF 机制默认是关闭的,可以通过以下配置文件进行修改


appendonly no  //是否开启AOF机制,默认是no表示关闭,修改为yes则表示开启
appendfilename "appendonly.aof"  //AOF文件名

PS:和 RDB 机制一样,其生成文件的路径也是通过 dir 属性进行配置。

AOF 机制数据是否实时写入磁盘

AOF 机制下数据是否实时写入磁盘,这个和 Mysqlredo log 机制很类似,也是需要通过参数来进行控制。

AOF 数据何时写入磁盘由参数 appendfsync 来进行控制:

appendfsync 描述 备注
always 写入缓存的同时通知操作系统刷新(fsync)到磁盘(但是也可能会有部分操作系统只是尽快刷盘,而不是实时刷盘) Slow, Safest
everysec 先写入缓存,然后每秒中刷一次盘(默认值),这种模式极端情况可能会丢失 1s 的数据 Compromise
no 只写入缓存,什么时候刷盘由操作系统自己决定 Faster

AOF 文件重写

AOF 机制主要是通过记录执行命令的方式来实现的,那么随着时间的增加,AOF 文件不可避免的会越来越大,而且可能会出现很多冗余命令。比如同一个 key 值执行了 10000set 操作,实际上前面 9999 次对恢复数据来说都是没用的,只需要执行最后一次命令就可以把数据恢复,正是为了避免这种问题,AOF 机制就提供了文件重写功能。

重写原理分析

AOF 重写时 Redis 并不会去分析原有的文件,因为如果原有文件过大,分析也会很耗时,所以 Redis 选择的做法就是重新去 Redis 中读取现有的键值对,然后用一条命令记录键值对的值

只使用一条命令也有一个前提,那就是一个集合键或者列表键或者哈希键内包含的元素不能超过 64 个,一旦超过 64 个,就会使用多条命令来进行记录。

AOF 重写缓冲区

AOF 重写的时候一般都会有大量的写操作,所以为了不阻塞客户端的命令请求,Redis 会把重写操作放入到子进程中执行,但是放入子进程中执行也会带来一个问题,那就是重写期间如果同时又执行了客户端发过来的命令,又该如何保证数据的一致性?

为了解决数据不一致问题,Redis 中引入了一个 AOF 重写缓冲区。当开始执行 AOF 文件重写之后又接收到客户端的请求命令,不但要将命令写入原本的 AOF 缓冲区(根据上面提到的参数刷盘),还要同时写 入 AOF 重写缓冲区:

在这里插入图片描述

一旦子进程完成了 AOF 文件的重写,此时会向父进程发出信号,父进程收到信号之后会进行阻塞(阻塞期间不执行任何命令),并进行以下两项工作:

  1. AOF 重写缓冲区的文件刷新到新的 AOF 文件内。
  2. 将新 AOF 文件进行改名并原子的替换掉旧的 AOF 文件。

完成了上面的两项工作之后,整个 AOF 重写工作完成,父进程开始正常接收命令。

AOF 机制触发条件

AOF 机制的触发条件同样也分为自动触发和手动触发。

自动触发:自动触发可以通过以下参数进行设置:


auto-aof-rewrite-percentag //文件大小超过上次AOF重写之后的文件的百分比。默认100,也就是默认达到上一次AOF重写文件的2倍之后会再次触发AOF重写
auto-aof-rewrite-min-size //设置允许重写的最小AOF文件大小,默认是64M。主要是避免满足了上面的百分比,但是文件还是很小的情况。

手动触发:执行 bgrewriteaof 命令。

注意:bgrewriteaof 命令也不能和上面 RDB 持久化命令 bgsave 同时执行,这么做是为了避免同时创建两个子进程来同时执行大量写磁盘操作,影响到 Redis 的性能。

AOF 机制机制优点

  • 使用 AOF 机制,可以自由选择不同 fsync (刷盘)策略,而且在默认策略下最多也仅仅是损失 1s 的数据。
  • AOF 日志是一个仅追加的日志,因此如果出现断电,也不存在查找或损坏问题。即使由于某些原因(磁盘已满或其他原因),日志已经写了一半的命令结束,redis-check-aof工具也能够轻松地修复它。
  • AOF 文件变得太大时,Redis 能够在后台自动重写。
  • 不同于 RDB 的文件格式,AOF 是一种易于理解和解析的格式,依次包含所有操作的日志。

AOF 机制机制缺点

  • 对于相同的数据集,AOF 文件通常比等效的 RDB 文件大。
  • 根据 fsync 的具体策略,AOF 机制可能比 RDB 机制慢。但是一般情况下,fsync 设置为每秒的性能仍然很高,禁用 fsync 后,即使在高负载下,它的速度也能和 RDB 一样快。
  • 因为 AOF 文件是追加形式,可能会遇到 BRPOPLPUSH 等阻塞命令的错误,从而导致生成的 AOF 在重新加载时不能复制完全相同的数据集,而 RDB 文件每次都是重新从头创建快照,这在一定程度上来说 RDB 文件更加健壮。

总结

本文主要介绍了 Redis 的两种持久化机制:RDBAOF,并分别介绍了两种持久化机制的原理,通过对两种持久化机制的对比分析了两种持久化机制各自的优点和缺点。

到此这篇关于为什么断电后Redis数据不会丢失的文章就介绍到这了,更多相关Redis数据丢失内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: 为什么断电后Redis数据不会丢失

本文链接: https://www.lsjlt.com/news/132190.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 为什么断电后Redis数据不会丢失
    目录前言Redis 持久化机制RDB 持久化机制RDB 机制触发条件自动触发RDB 机制相关配置文件RDB 机制优点RDB 机制缺点AOF 持久化机制AOF 机制如何开启AOF 机制...
    99+
    2024-04-02
  • 断电后Redis数据不会丢失的原因是什么
    这篇文章将为大家详细讲解有关断电后Redis数据不会丢失的原因是什么,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。前言Redis 作为一款内存数据库,被广泛使用于缓存,分布式锁等场景,那么假如断电或者因其...
    99+
    2023-06-20
  • MySQL为什么不会丢失数据
    本篇内容介绍了“MySQL为什么不会丢失数据”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!进入正题前先简单...
    99+
    2024-04-02
  • 为什么数据库会丢失数据
    今天就跟大家聊聊有关为什么数据库会丢失数据,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。数据库管理系统在今天已经是软件的重要组成部分,开源的 MyS...
    99+
    2024-04-02
  • docker容器退出后数据为什么会丢失
    Docker容器的数据丢失主要有以下几个原因: 容器是临时性的:Docker容器被设计成短暂的,一旦容器停止或退出,容器内的数据...
    99+
    2024-04-03
    docker
  • Redis Cluster到底会不会丢数据
    这篇文章给大家介绍Redis Cluster到底会不会丢数据,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。 Redis Cluster 会丢数据吗?Redi...
    99+
    2024-04-02
  • win7升级win10数据会不会丢失
    这篇文章主要讲解了“win7升级win10数据会不会丢失”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“win7升级win10数据会不会丢失”吧!win7升级win10数据保持完整及安装教程解...
    99+
    2023-07-01
  • 怎么确保redis数据不丢失
    Redis 是一种内存数据库,它的数据都保存在内存中,因此在断电或重启等异常情况下,数据可能会丢失。为了确保 Redis 数据不丢失...
    99+
    2023-05-23
    redis数据不丢失 redis
  • 阿里云重启redis不会丢失数据库怎么办
    问题:如何保证阿里云重启redis时不会丢失数据库? 阿里云是一款非常优秀的云计算服务提供商,而redis是阿里云提供的一种基于内存的分布式数据结构存储系统。然而,由于阿里云的重启机制可能会导致redis的临时断开连接,从而导致数据的丢失。...
    99+
    2023-12-26
    阿里 重启 数据库
  • vps美国服务器数据为什么会丢失
    vps美国服务器数据丢失的原因有:1、服务器被恶意网络攻击,如被恶意植入木马和病毒,造成数据丢失;2、服务器的物理硬件老化或损坏,导致数据存储失败,从而造成数据丢失;3、人为的操作失误,导致误删vps美国服务器的数据信息。具体内容如下:网站...
    99+
    2024-04-02
  • 什么情况mysql会丢失数据
    这期内容当中小编将会给大家带来有关什么情况mysql会丢失数据,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。什么情况mysql会丢失数据1.存储引擎层面丢失数据 ,如果服...
    99+
    2024-04-02
  • win10系统还原会不会丢失数据
    今天小编给大家分享一下win10系统还原会不会丢失数据的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。小编回答: 系统还原一般...
    99+
    2023-07-01
  • vps国外云服务器为什么会丢失数据
    vps国外云服务器丢失数据的原因有:1、vps国外云服务器被恶意网络攻击,造成数据丢失;2、vps国外云服务器的物理硬件老化或损坏,导致数据存储失败,从而造成数据丢失;3、人为操作失误导致误删vps国外云服务器的数据信息。具体内容如下:网站...
    99+
    2024-04-02
  • docker容器停止后数据会丢失吗
    Docker容器停止后,容器内的数据默认会保留在容器的文件系统中,并不会丢失。但是,如果删除了容器,则容器内的数据也会被删除。为了保...
    99+
    2024-04-02
  • 云服务器重启会不会丢失数据
    云服务器通常不会丢失数据。如果云服务器发生故障或关闭,您可以通过重新启动云服务器来避免数据丢失。 以下是一些可能导致云服务器重启并丢失数据的故障或异常情况: 硬件故障:云服务器通常使用高可用性硬件,可能会发生硬件故障。如果硬件故障,您的...
    99+
    2023-10-26
    会不会 重启 服务器
  • win7升级win10系统数据会不会丢失
    这篇文章主要介绍“win7升级win10系统数据会不会丢失”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“win7升级win10系统数据会不会丢失”文章能帮助大家解决...
    99+
    2023-03-01
    win7 win10
  • 云服务器重启会不会丢失数据呢
    云服务器重启并不会丢失数据,重启是为了修复服务器硬件或软件的问题。如果您的云服务器出现故障或者发生硬件故障,重启将是最快且最可靠的解决办法。但是,如果您的云服务器使用了定时重启功能,您的数据可能会保存在服务器的不同区域中,因此您可能需要使用...
    99+
    2023-10-26
    会不会 重启 服务器
  • redis数据丢失怎么处理
    处理 Redis 数据丢失的方法: 检查 Redis 配置文件:首先检查 Redis 的配置文件是否正确配置了持久化选项,包括 ...
    99+
    2024-04-19
    redis
  • redis丢失数据怎么定位
    当Redis发生数据丢失时,可以通过以下步骤来定位问题:1. 检查Redis的日志文件:查看Redis的日志文件,通常是redis-...
    99+
    2023-08-30
    redis
  • php redis数据丢失怎么办
    本教程操作环境:linux5.9.8系统、PHP8.1版、Dell G3电脑。php redis数据丢失怎么办?linux服务器重启后导致redis数据丢失直接上解决方案:1.找到 /etc/sysctl.confvim /etc/sysc...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作