【redis学习篇】Redis三种持久化方式详解

news2024/9/21 16:44:37

官方文档

一、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. 每天晚上将当前机器上的备份复制一份到其他机器上,以防机器损坏

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/393236.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

程序员的上帝视角(4)——视角

对于开发人员来说,工作都是从评估一个需求开始。我们第一个要解决的问题就是看待需求的视角。视角的不同,得到的设计方案可能是完全不同的。作为一个程序员,不能单单从个人视角来看待问题。而是要尝试从不同角色出发,不停思考。上…

C++——内存管理

一,为什么要有内存管理因为在C/C中各个内置类型或者是自定义类型的大小都不一样,而如何让各个类型在内存中合理分布就非常有必要,由此我们就需要有内存管理。我们来看看下面这个程序中的各个变量都是如何分布的int globalVar 1; static int …

100种思维模型之混沌与秩序思维模型-027

人类崇尚秩序与连续性,我们习惯于我们的日常世界,它以线性方式运作,没有不连续或突跳。 为此,我们学会了期望各种过程以连续方式运行,我们的内心为了让我们更有安全感,把很多事物的结果归于秩序&#xff0c…

链表的中间结点与链表的倒数第k个结点(精美图示详解哦)

全文目录引言链表的中间结点题目描述与思路实现链表的倒数第k个结点题目描述与思路实现总结引言 在上一篇文章中,介绍了反转链表 我们利用了链表是逻辑连续的特点,逆置了链表的逻辑连接顺序,从而实现反转链表: 戳我查看反转链表详…

【编程基础之Python】11、Python中的表达式

【编程基础之Python】11、Python中的表达式Python中的表达式表达式与运算符算术表达式赋值表达式比较表达式逻辑表达式位运算表达式总结Python中的表达式 在Python中,表达式是由操作数、运算符和函数调用等组成的语法结构,可以进行各种数学运算、逻辑判…

Maven环境下构建多模块项目

使用maven提供的多模块构建的特征完成maven环境下多模块的项目的管理和构建 这里以四个模块为例来搭建项目,以达到通俗易懂的初衷 模块 maven_parent -- 基模块,也就是常说的parent (pom) 模块 maven_dao -- 数据库访问层,例如jdbc操作(jar) …

华为OD机试题,用 Java 解【查找重复代码】问题

华为Od必看系列 华为OD机试 全流程解析+经验分享,题型分享,防作弊指南)华为od机试,独家整理 已参加机试人员的实战技巧华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单华为OD机试真题大全,用 Python 解华为机试题 | 机试宝典使用说明 参加华为od机试,一定要注意不…

深度学习技巧应用3-神经网络中的超参数搜索

大家好,我是微学AI,今天给大家带来深度学习技巧应用3-神经网络中的超参数搜索。 在深度学习任务中,一个算法模型的性能往往受到很多超参数的影响。超参数是指在模型训练之前需要我们手动设定的参数,例如:学习率、正则…

计算机科学导论笔记(三)

五、计算机组成 计算机组成部件可以分为三大类(子系统):中央处理单元(CPU)、主存储器和输入/输出子系统。 5.1 中央处理单元(CPU) 中央处理单元用于数据的运算,分为算术逻辑单元&a…

谁是世界上最好的编程语言?--编程语言70年浅谈

1、编程语言发展史纵览 严谨起见,本文提到的编程语言指的是「第三代高级编程语言」。 首先,我们从时间维度入手聊聊编程语言。一图胜千言,我们从目前主流的编程语言中,挑选出流行的、具有历史影响力的语言。把它们按时间从上往下…

【Java笔记】泛型

本章专题与脉络 泛型概述 生活中的例子 举例1:中药店,每个抽屉外面贴着标签 举例2:超市购物架上很多瓶子,每个瓶子装的是什么,有标签 举例3:家庭厨房中: Java中的泛型,就类似于上…

Spark 平衡 CPU

Spark 平衡 CPUCPU/内存平衡CPU 低效线程挂起调度开销优化 CPUCPU/内存平衡 Spark 将内存分 : Execution Memory : 用于分布式任务执行Storage Memory : 用于 RDD 缓存RDD 缓存展开前消耗 Execution Memory , 最后占用 Storage Memory 线程/执行内存关系: 执行内…

Eclipse快捷键,IDEA中使用Eclipse快捷键

/** Eclipse中的快捷键:* 1.补全代码的声明:alt /形参提示:Ctrl alt /* 2.快速修复: ctrl 1 * 3.批量导包:ctrl shift o* 4.使用单行注释:ctrl /* 5.使用多行注释: ctrl shift / * 6.取消多行注释…

《数据解构》HashMap源码解读

👑作者主页:Java冰激凌 📖专栏链接:数据结构 目录 了解HashMap HashMap的构造 两个参数的构造方法 一个参数的构造方法 不带参数的构造方法 哈希表初始化的长度 HashMap源码中的成员 Pt Get 了解HashMap 首先我们要明…

C语言——文件操作

文章目录0. 思维导图1. 为什么使用文件2. 什么是文件2.1 程序文件2.2 数据文件2.3 文件名3. 文件的打开和关闭3.1 文件指针3.2 文件的打开和关闭4. 文件的顺序读写4.1 字符/字符串写入(出)4.2 格式化写入(出)4.3 二进制输入&#…

拼多多的赶超让京东感受到压力,如今才发起百亿补贴可能晚了

近段时间以来,京东推出百亿补贴计划的宣传可谓铺天盖地,看起来京东这是要奋起反击了,然而拼多多如今的体量已经足够大,超越了京东,京东再发起反击已经晚了。一、拼多多超越了京东在用户数方面,早在2021年底…

GitLab创建仓库分配权限

文章目录创建仓库分配权限参考资料创建仓库 点击“New project”创建新项目 分配权限 点击左侧菜单栏“Members”成员,菜单 “Invite member”邀请成员,添加人员;“Invite group”邀请组织,添加一个组织所有成员下面输入框搜索…

ASEMI高压MOS管7N60参数,7N60封装,7N60规格

编辑-Z ASEMI高压MOS管7N60参数: 型号:7N60 漏极-源极电压(VDS):600V 栅源电压(VGS):30V 漏极电流(ID):7A 功耗(PD)…

如何规避近年频发的数据安全事故?浅谈 SaaS 数据安全之路

近几年,删库跑路事件在国内频频发生。前有“某公司程序员删库跑路被判刑六年”,后有某公司几百家客户数据遭严重删除。这不仅为公司本身带来直接的财产损失,更为严重的是,公司的公信力、品牌形象也随之毁于一旦。值得注意的是&…

零基础如何学习Web 安全,如何让普通人快速入门网络安全?

前言 网络安全现在是朝阳行业,缺口是很大。不过网络安全行业就是需要技术很多的人达不到企业要求才导致人才缺口大 初级的现在有很多的运维人员转网络安全,初级也会慢慢的卷起来,但是岗位多不用怕,以后各大厂也都会要网络安全人…