我的编程空间,编程开发者的网络收藏夹
学习永远不晚

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

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

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

前言

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数据丢失内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

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

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

下载Word文档

猜你喜欢

断电后Redis数据不会丢失的原因是什么

这篇文章将为大家详细讲解有关断电后Redis数据不会丢失的原因是什么,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。前言Redis 作为一款内存数据库,被广泛使用于缓存,分布式锁等场景,那么假如断电或者因其
2023-06-20

docker容器退出后数据为什么会丢失

Docker容器的数据丢失主要有以下几个原因:容器是临时性的:Docker容器被设计成短暂的,一旦容器停止或退出,容器内的数据就会丢失。这是因为Docker容器与宿主机是隔离的,容器内的数据并不会持久保存在宿主机上。数据卷未挂载:如果在运行
docker容器退出后数据为什么会丢失
2024-04-03

怎么确保redis数据不丢失

Redis 是一种内存数据库,它的数据都保存在内存中,因此在断电或重启等异常情况下,数据可能会丢失。为了确保 Redis 数据不丢失,可以采取以下措施:1、持久化Redis 支持两种持久化方式,分别是 RDB 和 AOF。RDB 是将 Re
2023-05-23

阿里云重启redis不会丢失数据库怎么办

问题:如何保证阿里云重启redis时不会丢失数据库?阿里云是一款非常优秀的云计算服务提供商,而redis是阿里云提供的一种基于内存的分布式数据结构存储系统。然而,由于阿里云的重启机制可能会导致redis的临时断开连接,从而导致数据的丢失。因此,在使用阿里云redis时,需要采取一些措施来确保数据不会丢失。使用持久
阿里云重启redis不会丢失数据库怎么办
2023-12-26

云服务器重启会不会丢失数据呢怎么办

云服务器重启是指将数据从一台服务器上迁移到另一台服务器上,通常会导致数据的丢失或者损坏。重启过程可能会引起服务器硬件资源的消耗,如磁盘空间、带宽等。如果您的网站或数据库受到了影响,重启可能会导致数据永久丢失或损坏。建议您采取以下措施来确保网站或数据库不受到损害:备份数据:定期备份数据到不同的服务器上,以避免数据丢失和损坏。使用可靠的数据加密算法:使用高强度的加密算法对数据进行加密,以确保
2023-10-26

云服务器重启会不会丢失数据信息呢怎么办

云服务器重启是指将云服务器关闭或停止运行,以便在需要时恢复数据。如果你的问题是云服务器重启会丢失数据信息,那么以下是一些常见的解决方法:检查云服务器是否正常运行或关闭:首先,确保云服务器在运行时处于正常运行状态,并且没有关闭或停止运行。如果云服务器出现故障,应该尝试重新启动云服务器。检查云服务器的日志文件:云服务器的日志文件记录了云服务器的运行状态。如果云服务器的日志文件中包含某些信息,可能会导致重启云服务...
2023-10-27

php数据库为什么会连接失败

有以下几个可能的原因导致PHP数据库连接失败:1. 数据库服务器无法连接:检查数据库服务器是否正常运行,并且网络连接是否正确。可以尝试使用telnet命令测试数据库服务器的连接情况。2. 数据库凭据错误:检查连接数据库时使用的用户名和密码是
2023-10-10

kafka保证数据不丢失的方法是什么

Kafka通过以下方法来保证数据不丢失:1. 持久化:Kafka使用持久化日志来存储所有的消息。消息在被写入到磁盘之前会被持久化,确保即使在发生故障时也不会丢失。2. 写入确认:Kafka提供了多种写入确认机制,包括"acks"参数和"mi
2023-09-14

阿里云服务器升级配置后数据会丢失吗怎么办

如果您的阿里云服务器出现故障需要进行升级,请确保您的数据已经成功迁移到新的存储设备上。如果您的云服务器配置了数据迁移工具,但并没有进行数据迁移,请检查您的数据是否仍然存在于旧的云服务器中。如果数据仍然在云服务器中,则建议您联系阿里云服务提供商以解决数据丢失的问题。如果云服务器配置了数据迁移工具,但是您并没有进行数据迁移,建议您联系阿里云服务提供商以解决问题。他们可以协助您解决数据丢失的问题。
2023-10-26

云服务器重启会不会丢失数据呢苹果手机怎么设置

对于苹果手机来说,如果您重启了云服务器,数据可能会丢失。这是因为云服务器的存储空间有限,而应用程序需要持续使用云服务器的存储空间。如果您不经常使用应用程序,而只是偶尔使用它们,那么云服务器的存储空间可能不足以存储所有应用程序的数据。另外,如果您重启云服务器后删除了一些数据,您的手机会重新安装它们。这样做也可能导致数据丢
2023-10-27

阿里云服务器升级配置后数据会丢失吗怎么办啊

如果您的阿里云服务器配置后数据出现丢失的情况,您可以按照以下步骤进行处理:查看服务器配置。确保您的阿里云服务器是一个完整的配置,可以访问Web应用程序、数据库等,并且数据存储在一个可用的位置。您可以使用Chrome、Firefox、Edge等浏览器打开Safari,在地址栏中输入“sudostealthedata”来查看服务器配置。重新配置服务器配置。如果您之前已经配置了服务器,但配置文件出现改变,您需要重新配置服务器。您可以在控制台窗口中...
2023-10-26

linux根目录扩容不丢失数据的方法是什么

要在Linux系统中扩展根目录而不丢失数据,可以使用以下方法:1. 创建新的分区:首先,您需要使用磁盘分区工具(如fdisk或parted)创建一个新的分区,然后将其格式化为需要的文件系统类型(如ext4)。2. 挂载新分区:将新分区挂载到
2023-09-29

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录