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

目录
  • 前言
  • Redis 持久化机制
    • RDB 持久化机制
    • RDB 机制触发条件
    • 自动触发
    • RDB 机制相关配置文件
    • RDB 机制优点
    • RDB 机制缺点
  • AOF 持久化机制
    • AOF 机制如何开启
    • AOF 机制数据是否实时写入磁盘
    • AOF 文件重写
    • AOF 重写缓冲区
    • 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数据丢失内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Redis主从集群切换数据丢失的解决方案

    一.数据丢失的情况 异步复制同步丢失 集群产生脑裂数据丢失 1.异步复制丢失 对于Redis主节点与从节点之间的数据复制,是异步复制的,当客户端发送写请求给master节点的时候,客户端会返回OK,然后同步到各个slave节点中. 如果此时master还没来得及同步给slave节点时发生宕机,那么master内存中的数据会丢失: 要是master中开启持久化设置数据可不可以保证不丢失呢?答案是否定的.在master 发生宕机后,sentinel集群检测到master发生故障,重新选举新的mast

  • 解决docker重启redis,mysql数据丢失的问题

    官方文档: 所以 mysql应如下启动: docker run -p 3306:3306 -d -e MYSQL_ROOT_PASSWORD=密码 -v /windows盘符/指定的文件夹路径:/var/lib/mysql    mysql:5.7 redis: docker run -p 6379:6379 -d  -v /windows盘符/指定的文件夹路径:/data    redis:5.0 redis-server --appendonly yes 多看官方文档,里面有详细的说明 补充

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

    目录 前言 Redis 持久化机制 RDB 持久化机制 RDB 机制触发条件 自动触发 RDB 机制相关配置文件 RDB 机制优点 RDB 机制缺点 AOF 持久化机制 AOF 机制如何开启 AOF 机制数据是否实时写入磁盘 AOF 文件重写 AOF 重写缓冲区 AOF 机制触发条件 AOF 机制机制优点 AOF 机制机制缺点 总结 前言 Redis 作为一款内存数据库,被广泛使用于缓存,分布式锁等场景,那么假如断电或者因其他因素导致 Reids 服务宕机,在重启之后数据会丢失吗? Redis

  • Android实现关机后数据不会丢失问题

    要实现关机后数据也不会丢失,需要使用到 AndroidViewModel,SaveStateHandle 和 SharePreferences 要达到的目的就是将数据保存成这个亚子 就不会出现app在异常闪退或者关机后数据的丢失了注意在使用SaveStateHandle和binding的时候需要在gradle里面设置一波 数据类 package com.example.applicationtest04; import android.app.Application; import androi

  • redis数据的两种持久化方式对比

    一.概念介绍 redis提供了两种持久化的方式,分别是RDB(Redis DataBase)和AOF(Apend Only File). RDB方式 RDB方式是一种快照式的持久化方法,将某一时刻的数据持久化到磁盘中. •redis在进行数据持久化的过程中,会先将数据写入到一个临时文件中,待持久化过程都结束了,才会用这个临时文件替换上次持久化好的文件.正是这种特性,让我们可以随时来进行备份,因为快照文件总是完整可用的. •对于RDB方式,redis会单独创建(fork)一个子进程来进行持久化,而

  • 关于Redis数据持久化的概念介绍

    目录 一.数据持久化的概述 1.RDB持久化 2.开启AOF 二 .RDB 和 AOF 的优缺点 1. RDB 持久化优缺点 2. AOF 持久化优缺点 一.数据持久化的概述 Redis是内存数据库,数据都是存储在内存中,为了避免服务器断电等原因导致Redis进程异常退出后数据的永久丢失,需要定期将Redis中的数据以某种形式(或命数据令)从内存保存到硬盘;当下次Redis重启时,利用持久化文件实现数据恢复.除此之外,为了进行灾难备份,可以将持久化文件拷贝到一个远程位置(NFS) . Redis

  • Redis数据持久化方式技术解析

    RDB(Redis DataBases) 1.RDB是什么: 在指定的时间间隔内将内存中的数据集快照写入磁盘,也就是Snapshot快照,它恢复时是将快照文件直接读到内存里. Redis会单独创建(fork)一个子进程来进行持久化,会将数据写入到一个临时文件中,持久化过程都结束了,再用这个临时文件替换上次持久化好的文件.整个过程中,主进程是不进行任何IO操作的,这就确保了极高的性能,如果需要进行大规模数据的恢复,且对于数据恢复的完整性不是非常敏感,那RDB方式是要比AOF方式更加的高效.RDB的

  • 在redis中防止消息丢失的机制

    目录 如何在redis中防止消息丢失 前言 同步的事务——停止等待 同步的事务——连续ARQ 异步的事务——回调机制 消息的幂等处理 如何在redis中防止消息丢失 前言 在项目中,由于网络问题,我们很难保证生产者发送的消息能100%到达消息队列服务器,也就是说有消息丢失的可能性,因 此,生产者就必须具有消息丢失检测和重发机制,也就是我们常说的消息队列的事物机制. 不能把可靠性的保证全部交给TCP,TCP只保证了传输层的可靠传输,但是无法保证与应用层的交互是否出错 TCP无法给应用层任何反馈,因

  • C++开发的Redis数据导入工具优化

    背景 使用C++开发了一个Redis数据导入工具 从oracle中将所有表数据导入到redis中: 不是单纯的数据导入,每条oracle中的原有记录,需要经过业务逻辑处理, 并添加索引(redis集合): 工具完成后,性能是个瓶颈: 优化效果 使用了2个样本数据测试: 样本数据a表8763 条记录: b表940279 条记录: 优化前,a表耗时11.417s: 优化后,a表耗时1.883s: 用到的工具 gprof, pstrace,time 使用time工具查看每次执行的耗时,分别包含用户时间

  • Redis数据导入导出以及数据迁移的4种方法详解

    1.aof 导入方式. 因为这种方式比较简单,所以我就先介绍它. 分两步来实现,第一步先让源 Redis 生成 AOF 数据文件. # 清空上文目标实例全部数据 redis-cli -h 目标RedisIP -a password flushall # 源实例开启 aof 功能,将在 dir 目录下生成 appendonly.aof 文件 redis-cli -h 源RedisIP -a password config set appendonly yes dir 目录,可以通过 config

  • Redis数据过期策略的实现详解

    目录 一.设置过期时间 1.常用方式 2.字符串独有方式 二.3种过期策略 三.Redis采用的过期策略 四.RDB对过期key的处理 五.AOF对过期key的处理 本文对Redis的过期机制简单的讲解一下 讲解之前我们先抛出一个问题,我们知道很多时候服务器经常会用到redis作为缓存,有很多数据都是临时缓存一下,可能用过之后很久都不会再用到了(比如暂存session,又或者只存放日行情股票数据)那么就会出现一下几个问题了 Redis会自己回收清理不用的数据吗?如果能,那如何配置?如果不能,如何

  • 浅谈内存耗尽后Redis会发生什么

    前言 作为一台服务器来说,内存并不是无限的,所以总会存在内存耗尽的情况,那么当 Redis 服务器的内存耗尽后,如果继续执行请求命令,Redis 会如何处理呢? 内存回收 使用Redis 服务时,很多情况下某些键值对只会在特定的时间内有效,为了防止这种类型的数据一直占有内存,我们可以给键值对设置有效期.Redis 中可以通过 4 个独立的命令来给一个键设置过期时间: expire key ttl:将 key 值的过期时间设置为 ttl 秒. pexpire key ttl:将 key 值的过期时

随机推荐