【redis学习篇】Redis三种持久化方式详解
创始人
2024-05-29 17:21:18
0

官方文档

一、Redis持久性

Redis如何将数据写入磁盘

持久性是指将数据写入持久存储,如固态磁盘(SSD)。Redis提供了一系列持久性选项。其中包括:

  • RDB(快照):RDB持久性以指定的时间间隔执行数据集的时间点快照。

  • AOF(追加写文件):AOF持久性记录服务器接收到的每个写入操作。然后可以在服务器启动时再次回放这些操作,重建原始数据集。使用与Redis协议本身相同的格式记录命令。

  • 无持久性:您可以完全禁用持久性。这有时在缓存时使用。

  • RDB+AOF:您也可以在同一实例中组合AOF和RDB。

二、RDB快照(snapshot)

  1. 默认情况下,Redis会将内存数据库的快照保存在一个名为 **dump.rdb**的二进制文件中。

  2. 你可以配置Redis,当满足“N秒内数据集至少有M个改动”的条件时,自动保存一次数据集。

例如,以下配置会让Redis在满足“60秒内有至少1000个键被改动”的条件下自动保存一次:

save 60 1000 //要关闭RDB,只需要将所有的save保存策略注释掉即可。

此外,你还可以手动执行命令来生成RDB快照,只需要进入Redis客户端,执行save或bgsave命令,就可以生成dump.rdb文件。每次执行这些命令时,都会将Redis内存中的快照保存到一个新的RDB文件中,并覆盖原有的RDB快照文件。

2.1 bgsave的写时复制(COW)机制

  1. Redis 通过利用操作系统提供的写时复制技术(Copy-On-Write, COW),在生成快照的同时,可以正常处理写命令。

  2. 换句话说,当满足写快照的条件时,主线程会fork一个bgsave 子进程,这个子进程可以共享主线程的所有内存数据。

  3. bgsave 子进程运行后,开始读取主线程的内存数据,并将其写入 RDB 文件 副本

  4. 此时,如果主线程对这些数据也都是读操作,那么,主线程和 bgsave 子进程就不会产生影响。

  5. 但是,如果主线程要修改一块数据,那么,这块数据将会被复制一份,生成该数据的副本。

  6. 然后,bgsave 子进程会把这个副本数据写入 RDB 文件,而在这个过程中,主线程仍然可以直接修改原来的数据。

save与bgsave对比:

命令savebgsave
I/O类型同步异步
是否阻塞redis其它命令否(在生成子进程执行调用fork函数时会有短暂阻塞)
复杂度O(n)O(n)
优点不会消耗额外内存不阻塞客户端命令
缺点阻塞客户端命令需要fork子进程,消耗内存

配置自动生成rdb文件后台使用的是bgsave方式。

2.2 RDB方式存在的问题

  1. RDB是满足了配置的条件才会进行持久化操作的,但是不能更改为每一秒都进行改动就写快照,因为RDB记录的是整个内存数据,这样会严重影响性能。

  2. 如果在未满足生成快照的条件之前,Redis就 宕机 了,就会导致数据丢失。

三、AOF(append-only file)

  1. 快照功能并不是非常耐久(durable): 如果 Redis 因为某些原因而造成故障停机, 那么服务器将丢失最近写入、且仍未保存到快照中的那些数据。

  2. 从 1.1 版本开始, Redis 增加了一种完全耐久的持久化方式: AOF 持久化,将修改的每一条指令追加写进文件 appendonly.aof 中(先写入os cache,每隔一段时间fsync到磁盘)

比如执行命令“set zhuge 666”,aof文件里会记录如下数据

*3
$3
set
$5
zhuge
$3
666

这是一种 resp 协议格式数据,星号 后面的数字代表命令有多少个参数,$号 后面的数字代表这个参数有几个字符

注意:如果执行带过期时间的set命令,aof文件里记录的是并不是执行的原始命令,而是记录key过期的 时间戳

比如执行“set tuling 888 ex 1000”,对应aof文件里记录如下

*3
$3
set
$6
tuling
$3
888
*3
$9
PEXPIREAT
$6
tuling
$13
1604249786301

你可以通过修改配置文件来打开 AOF 功能:

appendonly yes
  1. 开启后,每当 Redis 执行一个改变数据集的命令时(比如 SET), 这个命令就会被追加到 AOF 文件的末尾。
  2. 这样的话, 当 Redis 重新启动时, 程序就可以通过重新执行 AOF 文件中的命令来达到重建数据集的目的。

3.1 配置 Redis 数据 fsync 到磁盘

有三个选项:

appendfsync always:每次有新命令追加到 AOF 文件时就执行一次 fsync ,非常慢,也非常安全。
appendfsync everysec:每秒 fsync 一次,足够快,并且在故障时只会丢失 1 秒钟的数据。
appendfsync no:从不 fsync ,将数据交给操作系统来处理。更快,也更不安全的选择。

推荐(并且也是默认)的措施为每秒 fsync 一次, 这种 fsync 策略可以兼顾速度和安全性。

3.2 AOF重写

AOF文件里可能有太多没用指令,所以AOF会定期根据内存的最新数据生成aof文件

例如,执行了如下几条命令:

127.0.0.1:6379> incr readcount
(integer) 1
127.0.0.1:6379> incr readcount
(integer) 2
127.0.0.1:6379> incr readcount
(integer) 3
127.0.0.1:6379> incr readcount
(integer) 4
127.0.0.1:6379> incr readcount
(integer) 5

重写后AOF文件里变成

*3
$3
SET
$2
readcount
$1
5

3.3 AOF自动重写频率配置

# auto-aof-rewrite-min-size 64mb   //aof文件至少要达到64M才会自动重写,文件太小恢复速度本来就很快,重写的意义不大
# auto-aof-rewrite-percentage 100  //aof文件自上一次重写后文件大小增长了100%则再次触发重写

当然AOF还可以手动重写,进入redis客户端执行命令 bgrewriteaof 重写AOF

注意:AOF重写redis会fork出一个子进程去做(与bgsave命令类似),不会对redis正常命令处理有太多影响

RDB 和 AOF ,我应该用哪一个?

方式RDBAOF
启动优先级
体积小(二进制压缩的方式存储)
恢复速度
数据安全性容易丢数据根据策略决定

redis启动时如果既有rdb文件又有aof文件则 优先选择aof文件恢复数据,因为aof一般来说数据更全一点。

四、Redis 4.0 混合持久化

  1. 重启 Redis 时,我们很少使用 RDB来恢复内存状态,因为会丢失大量数据。

  2. 我们通常使用 AOF 日志重放,但是重放 AOF 日志性能相对 RDB来说要慢很多,这样在 Redis 实例很大的情况下,启动需要花费很长的时间。

  3. Redis 4.0 为了解决这个问题,带来了一个新的持久化选项——混合持久化。

通过如下配置可以开启混合持久化(必须先开启aof):

# aof-use-rdb-preamble yes   
  1. 如果开启了混合持久化,AOF在重写时,不再是单纯将内存数据转换为RESP命令写入AOF文件

  2. 而是将重写这一刻之前的内存做RDB快照处理,并且将RDB快照内容和增量的AOF修改内存数据的命令存在一起,都写入新的AOF文件

  3. 新的文件一开始不叫appendonly.aof,等到重写完新的AOF文件才会进行改名,覆盖原有的AOF文件,完成新旧两个AOF文件的替换。

  4. 于是在 Redis 重启的时候,可以 先加载 RDB 的内容,然后再重放增量 AOF 日志就可以完全替代之前的 AOF 全量文件重放,因此重启效率大幅得到提升。

混合持久化AOF文件结构如下

在这里插入图片描述

4.1 Redis数据备份策略:

  1. 写crontab定时调度脚本,每小时都copy一份rdb或aof的备份到一个目录中去,仅仅保留最近48小时的备份

  2. 每天都保留一份当日的数据备份到一个目录中去,可以保留最近1个月的备份

  3. 每次copy备份的时候,都把太旧的备份给删了

  4. 每天晚上将当前机器上的备份复制一份到其他机器上,以防机器损坏

相关内容

热门资讯

安卓系统用的华为应用,探索智能... 你知道吗?在安卓系统里,华为的应用可是个宝库呢!它们不仅功能强大,而且使用起来超级方便。今天,就让我...
安卓变ios系统魅蓝 你知道吗?最近有个朋友突然告诉我,他要把自己的安卓手机换成iOS系统,而且还是魅蓝品牌的!这可真是让...
幻书启世录安卓系统,安卓世界中... 亲爱的读者们,你是否曾在某个夜晚,被一本神奇的书所吸引,仿佛它拥有着穿越时空的力量?今天,我要带你走...
电脑安装安卓系统进不去,安卓系... 电脑安装安卓系统后竟然进不去,这可真是让人头疼的问题啊!你是不是也遇到了这种情况,心里直呼“怎么办怎...
用键盘切换控制安卓系统,畅享安... 你有没有想过,用键盘来控制你的安卓手机?是的,你没听错,就是那个我们每天敲敲打打的小玩意儿——键盘。...
小米安卓镜像系统在哪,小米安卓... 你有没有想过,你的小米手机里有一个隐藏的宝藏——安卓镜像系统?没错,就是那个可以让你的手机瞬间变身成...
安卓手机下载排班系统,高效排班... 你有没有想过,每天忙碌的工作中,有没有什么好帮手能帮你轻松管理时间呢?今天,就让我来给你介绍一个超级...
桌面组件如何弄安卓系统,桌面组... 亲爱的桌面爱好者们,你是否曾梦想过将安卓系统搬到你的电脑桌面上?想象那些流畅的动画、丰富的应用,还有...
安卓13系统介绍视频,新功能与... 亲爱的读者们,你是否对安卓13系统充满好奇?想要一探究竟,却又苦于没有足够的时间去研究?别担心,今天...
车机安卓7.1系统,功能升级与... 你有没有发现,现在的车机系统越来越智能了?尤其是那些搭载了安卓7.1系统的车机,简直就像是个贴心的智...
安卓系统下如何读pdf,And... 你有没有遇到过这种情况:手机里存了一大堆PDF文件,可是怎么也找不到一个能顺畅阅读的工具?别急,今天...
安卓系统全国通用的吗,畅享智能... 你有没有想过,为什么你的手机里装的是安卓系统呢?安卓系统,这个名字听起来是不是有点神秘?今天,就让我...
假苹果手机8安卓系统,颠覆传统... 你有没有想过,如果苹果手机突然变成了安卓系统,会是怎样的景象呢?想象那熟悉的苹果外观,却运行着安卓的...
安卓12.0系统vivo有吗,... 你有没有听说最近安卓系统又升级啦?没错,就是那个让手机焕然一新的安卓12.0系统!那么,咱们国内的手...
核心芯片和安卓系统,探索核心芯... 你知道吗?在科技的世界里,有一对“黄金搭档”正悄悄改变着我们的生活。他们就是——核心芯片和安卓系统。...
如何调安卓系统屏幕颜色,安卓系... 亲爱的手机控们,你是否曾觉得安卓系统的屏幕颜色不够个性,或者是因为长时间盯着屏幕而感到眼睛疲劳?别担...
旧台式电脑安装安卓系统,轻松安... 你那台旧台式电脑是不是已经服役多年,性能逐渐力不从心,却又不忍心让它退役呢?别急,今天就来教你怎么给...
美国要求关闭安卓系统,科技霸权... 美国要求关闭安卓系统:一场技术革新还是政治博弈?在数字化时代,智能手机已经成为我们生活中不可或缺的一...
安卓系统日记本 你有没有发现,手机里的安卓系统日记本,简直就是记录生活点滴的宝藏库呢?想象每天忙碌的生活中,有没有那...
安卓手机广告最少的系统,探索安... 你有没有发现,用安卓手机的时候,广告总是无处不在,让人烦得要命?不过别急,今天我要给你揭秘一个秘密—...