【Redis从0到1进阶】Redis 持久化

笔记内容来自B站博主《遇见狂神说》:Redis视频链接

Redis 是内存数据库,如果不将内存中的数据库状态保存到磁盘,那么一旦服务器进程退出,服务器中的数据库状态也会消失。所有Redis 提供了持久化功能!

一、RDB(Redis DataBase)

什么是RDB

RDB 全称是 Redis DataBase,简而言之,就是在不同的时间点,将 redis 存储的数据生成快照并存储到磁盘等介质上。就是Redis的数据库。
在指定的时间间隔内将内存中的数据集快照写入磁盘,也就是Snapshot快照,它恢复时是将快照文件直接读到内存里。
Redis 会创建(fork)一个子进程来进行持久化,会先将数据写入到一个临时文件中,待持久化过程都结束了,再用这个临时文件替换上次持久化好的文件。整个过程中,主进程是不进行任何IO操作的。这就确保了极高的性能。如果需要进行大规模数据的恢复,且对于数据恢复的完整性不是非常敏感,那么RDB方式要比AOF方式更加的高效。
RDB的缺点是最后一次持久化后的数据可能丢失。
在这里插入图片描述

测试rdb

1、简单配置一下配置文件

rdb保存的文件默认是dump.rdb 可以在配置文件中配置。
在这里插入图片描述
先修改配置文件,注释掉默认的。设置60s内修改了3次key,就会触发rdb操作。
在这里插入图片描述
rdb保存的路径 /var/lib/redis
在这里插入图片描述

修改保存!需要重启redis服务,和删除rdb文件!!!

2、测试生成rdb文件

先删除 rdb 文件
在这里插入图片描述
这里我们set 三个值
在这里插入图片描述
60秒内修改了三次key, 触发rdb操作,生成dump.rdb文件
在这里插入图片描述

3、触发机制

1、save的规则满足情况下,会自动触发rdb规则
2、执行flush命令,
3、退出redis
备份就自动生成一个dump.rdb

4、恢复rdb文件

1、只需要将rdb文件放在我们redis启动目录就可以,redis启动的时候会自动检查dump.rdb 恢复其中的数据。
2、查询需要存在的位置。

127.0.0.1:6388> config get dir	# 获取配置文件中的 dir 属性
1) "dir"
2) "/var/lib/redis"	# 如果在这个目录下存在dump.rdb文件,启动就会自动恢复其中的数据

5、总结

Redis 的 rdb 默认配置几乎够我们自己使用了,但是我们还是需要学习
rdb的优缺点

优点:
1、适合大规模的数据恢复
2、对数据的完整性要求不高

缺点:
1、需要一定的时间间隔进程操作,如果redis意外宕机了,这个最后一次修改数据就没有的了
2、fork进程的时候,会占用一定的内容空间

图片取自redis中文网:
在这里插入图片描述

二、AOF(Append Onley File)

AOF,英文是 Append Only File,即只允许追加不允许改写的文件。
aof将我们的所有命令都记录下来,相当于历史记录(history),恢复的时候就把这个文件全部在执行一遍

什么是AOF

以日志的形式来记录每个写操作,将Redis执行过的所有指令记录下来(读操作不记录),只许追加文件但不可以改写文件,redis启动之初会读取该文件重新构建数据,换言之,redis重启的话就根据日志文件的内容将写指令从前到后执行一次以完成数据的恢复工作
在这里插入图片描述

1、append 配置文件

aof 默认是关闭的,报错的文件名为 appendonly.aof。 我们只需要把appendonly设置为yes就可以,其他保持默认状态已经够用。
在这里插入图片描述

重启redis就可以看到 appendonly.aof 文件
在这里插入图片描述

2、测试写入数据

首先我们在客户端set几个key

127.0.0.1:6388> flushdb	# 清除当前数据库
OK
127.0.0.1:6388> set name oldfe	# 这里我 set 三个key
OK
127.0.0.1:6388> set age 16
OK
127.0.0.1:6388> set city beijing
OK

然后我们查看一下aof文件

root@VM-20-10-ubuntu:/var/lib/redis# cat appendonly.aof 	# 使用 cat 查看文件内容
*2				# 这表示接下来有 2 个参数。 《select 0》
$6				# 接下来字符串的长度。《select》
SELECT			# 首先是我们的查询,默认查询当前数据库(下标为0的数据库)
$1				# 接下来字符串的长度。《0》
0				# 这是数据库的索引号,这里表示选择第一个数据库。
*3				# 这表示接下来有 3 个参数。《set name oldfe》
$3				
set				# 这是我们刚刚执行的命令。《set name oldfe》
$4
name			
$5
oldfe
*3
$3
set				# 这是我们刚刚执行的命令。《set age 16》
$3
age
$2
16
*3
$3
set				# 这是我们刚刚执行的命令。《set city beijing》
$4
city
$7
beijing

3、破坏aof文件进行测试启动

首先我们随便修改一下,破坏完好的数据。
在这里插入图片描述
然后进行redis重启,发现启动失败!因为aof文件有错位!这时候redis是启动不起来的。
在这里插入图片描述
莫慌,redis 提供修复工具 redis-check-aof
ubuntu系统上redis默认安装在 /usr/bin 目录下
在这里插入图片描述
使用aof工具进行修复

# 修复指定aof文件
redis-check-aof --fix /var/lib/redis/appendonly.aof

在这里插入图片描述
重启 redis。启动成功!
在这里插入图片描述
aof修复机制其实就是把错误的数据删除。我们再次查看修复好的aof 文件,发现错误的数据被删除。
在这里插入图片描述

4、总结

配置文件中 aof 的其他配置

appendonly no	# 默认是不开启aof模式,默认是使用rdb方式持久化,在大部分情况下,rdb完全够用
appendfilename "appendonly.aof"	 # 持久化的文件名

# appendfsync always	# 每次修改都会sync,消耗性能
appendfsync everysec	# 每秒执行一次,默认状态。可能会丢失这1s的数据
# appendfsync no	# 不执行 sync, 这个时候操作系统自己同步数据,速度最快

# 这个参数指定了在 AOF 文件当前大小超过上一次重写后大小的百分比增长时,触发自动 AOF 重写。
# 例如,如果设置为 100,则表示当 AOF 文件大小增长到上一次重写后大小的两倍时,触发自动 AOF 重写。
# 这有助于控制 AOF 文件的增长速度,以避免文件过大而影响性能。
auto-aof-rewrite-percentage 100

# 这个参数指定了进行自动 AOF 重写的最小 AOF 文件大小阈值。只有当当前 AOF 文件大小超过这个阈值时,
# 才会考虑触发自动 AOF 重写。在你的例子中,设置为 64mb 表示 AOF 文件必须达到 64MB 大小才会考虑进行自动重写。
auto-aof-rewrite-min-size 64mb

aof的优缺点:

优点:
1、每一次修改都同步,文件的完整会更加好
2、每秒同步一次,可能会丢失一秒的数据
3、从不同步、效率最高

缺点:
1、相对于数据文件来说,aof远远大于rdb,修复的速度也比rdb慢
2、aof运行效率也要比rdb慢,所以我们redis默认的配置就是rdb持久化

图片取自Redis中文网:
在这里插入图片描述

5、扩展。

1、RDB 持久化方式能够在指定的时间间隔内对你的数据进行快照存储
2、AOF 持久化方式记录每次对服务器写的操作,当服务器重启的时候会重新执行这些命令来恢复原始的数据,AOF命令以Redis 协议追加保存每次写的操作到文件末尾,Redis还能对AOF文件进行后台重写,是的 AOF文件的体积不至于过大。
3、只做缓存,如果你只希望你的数据在服务器运行的时候存在,你也可以不使用任何持久化
4、同时开启两种持久化方式

  • 在这种情况下,当Redis 重启的时候会优先载入AOF文件来恢复原始的数据,因为在通常情况下AOF文件保存的数据集要比RDB文件保存的数据集要完整。
  • RDB的数据不实时,同时使用两者时服务器重启也只会找AOF文件,那要不要只使用AOF呢?作者建议不要,因为RDB更适合用户备份数据库(AOF在不断变化不好备份),快速重启,而且不会有AOF可能潜在的Bug,留着作为一个万一的手段。

5、性能建议

  • 因为RDB文件只用作后备用途,建议只在Slave上持久化RDB文件,而且只要15分钟备份一次就够了,只保留save 900 1 这条规则。
  • 如果Enable AOF,好处是在最恶劣情况下也只会丢失不超过两秒的数据,启动脚本较简单只load自己的AOF文件就可以了,代价一是带来了持续的IO,二是AOF rewrite的最后将 rewrite过程中产生的新数据写到新文件造成的阻塞几乎是不可避免的。只要硬盘许可,应该尽量减少AOF rewrite 的频率,AOF重写的基础大小默认值64M太小了,可以设到5G以上,默认超过原大小100% 大小重写可以改到适当的数值。
  • 如果不 Enable AOF,仅靠Master-Slave Repllcation(复制) 实现高可用性也可以,能省掉一大笔IO,也减少了rewrite时带来的系统波动,代价是如果Master/Slave同时断电,会丢失十几分钟的数据,启动脚本也要比较两个Master/Slave中的RDB文件,载入较新的那个,微博就是这种架构。

温馨提示!!!

测试完成后记得把配置文件恢复默认!!!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【256 Days】我的创作纪念日

目录 🌼01 机缘 🌼02 收获 🌼03 日常 🌼04 成就 🌼05 憧憬 最近收到官方来信, 突然发现,不知不觉间,距离发布的第一篇博客已过256天,这期间我经历了春秋招、毕业答辩…

AV1 编码标准熵编码技术概述

AV1熵编码 AV1编码技术是一种开源的视频编解码标准,由开放媒体联盟(AOMedia)开发,旨在提供高效的视频压缩,同时避免复杂的专利授权问题。在熵编码方面,AV1采用了一种多符号上下文自适应算术编码技术&#x…

在 PostgreSQL 里如何实现数据的实时监控和性能瓶颈的快速定位?

🍅关注博主🎗️ 带你畅游技术世界,不错过每一次成长机会!📚领书:PostgreSQL 入门到精通.pdf 文章目录 在 PostgreSQL 里如何实现数据的实时监控和性能瓶颈的快速定位一、数据实时监控的重要性二、PostgreSQ…

数据库:基本操作

SQL struct query language 关系型数据库 非关系 芒果db ddl data defination language 建表 dml 新增 修改 删除一行 data modifty dql 查询 data query language 查询 select 数据库 sun solaris gnu 1、分类: 大型 中型 …

MySQL学习记录 —— 이십 常用工具包

文章目录 1、总览2、mysqlcheck - 表维护程序1、作用2、注意事项3、语法4、命令选项下面每块都大致有这四个部分 3、Mysqldump - 数据库备份程序4、mysqladmin - MySQL 服务器管理程序5、mysqlshow - 显示数据库、表和列信息6、mysqldumpslow - 总结慢查询日志文件7、mysqlbinl…

内存ECC基础纠错算法有哪些?

3.1 基础纠错算法 3.1.1 SECDED纠错算法 SECDED(Single Error Correction Double Error Detection)是一种经典的ECC方案,能够纠正单比特错误并检测出双比特错误。在图4(a)中,展示了SECDED的编码过程。在这个过程中,使…

STM32之八:IIC通信协议

目录 1. IIC协议简介 1.1 主从模式 1.2 2根通信线 2. IIC协议时序 2.1 起始条件和终止条件 2.2 发送一个字节 2.3 接收一个字节 2.4 应答信号 1. IIC协议简介 IIC协议是一个半双工、同步、一主多从、多主多从的串行通用数据总线。该通信模式需要2根线:SCL、…

mysql(5.5)启动服务和环境配置

正常启动 参考:Javaweb基础之mysql回溯笔记(一) 总的来说就是在mysql的安装目录下,找到bin下面的msyqld.exe,双击即启动了mysql服务; 启动方式二 也可以直接找到windows的服务项进行启动,操作如下: 打开…

opencascade AIS_InteractiveContext源码学习8 trihedron display attributes

AIS_InteractiveContext 前言 交互上下文(Interactive Context)允许您在一个或多个视图器中管理交互对象的图形行为和选择。类方法使这一操作非常透明。需要记住的是,对于已经被交互上下文识别的交互对象,必须使用上下文方法进行…

MySQL集群、Redis集群、RabbitMQ集群

一、MySQL集群 1、集群原理 MySQL-MMM 是 Master-Master Replication Manager for MySQL(mysql 主主复制管理器)的简称。脚本)。MMM 基于 MySQL Replication 做的扩展架构,主要用来监控 mysql 主主复制并做失败转移。其原理是将真…

linux高级编程(网络)(www,http,URL)

数据的封包和拆包 封包: 应用层数据(例如HTTP请求)被传递给传输层。传输层(TCP)在数据前添加TCP头部(包含端口号、序列号等)。网络层(IP)在TCP段前添加IP头部&#xff…

解读InnoDB数据库索引页与数据行的紧密关联

目录 一、快速走进索引页结构 (一)整体展示说明 (二)内容说明 File Header(文件头部) Page Header(页面头部) Infimum Supremum(最小记录和最大记录) …

多模态大模型 - MM1

1. 摘要 本文主要通过分析模型结构和数据选择讨论如何构建一个好的多模态大模型(MLLM),并同时提出了MM1模型,包括30B dense版本和64B的MoE版本。 具体贡献: 模型层面:影响效果的重要性排序为:…

昇思25天学习打卡营第10天|NLP-RNN实现情感分类

打卡 目录 打卡 任务说明 流程 数据准备与加载 加载预训练词向量(分词) 数据集预处理 模型构建 Embedding RNN(循环神经网络) LSTM 全连接层 损失函数与优化器 训练逻辑 评估指标和逻辑 模型训练与保存 模型加载与测试 自定义输入测试 …

周报(1)<仅供自己学习>

文章目录 一.pytorch学习1.配置GPU2.数据读取问题1(已解决问题2(已解决 3.卷积的学习 二.NeRF学习1.介绍部分问题1(已解决 2.神经辐射场表示问题2(已解决问题3(已解决问题4(已解决问题5:什么是视…

1-5岁幼儿胼胝体的表面形态测量

摘要 胼胝体(CC)是大脑中的一个大型白质纤维束,它参与各种认知、感觉和运动过程。尽管CC与多种发育和精神疾病有关,但关于这一结构的正常发育(特别是在幼儿阶段)还有很多待解开的谜团。虽然早期文献中报道了性别二态性,但这些研究的观察结果…

Armv8-R内存模型详解

目录 1.内存模型的必要性 2.Armv8-R内存模型分类 2.1 Normal memory 2.2 Device Memory 2.2.1 Gathering 2.2.2 Reordering 2.2.3 Early Write Acknowledgement 3.小结 大家好,今天是悲伤的肌肉。 在调研区域控制器芯片时,发现了S32Z、Stellar …

从Centos7升级到Rocky linux 9后,网卡连接显示‘Wired connection 1‘问题解决方法

问题描述 从Centos7升级到Rocky9后, 发现网卡eth0的IP不正确。通过nmcli查看网卡连接,找不到name为eth0的连接,只显示’Wired connection 1’ 查看/etc/NetworkManager/system-connections/,发现找不到网卡配置文件。 原因分析 centos7使…

git取消合并:--hard 或 --merge

第一步:查了git日志 git reflog如下,运行上述命令后,可以看见所有的提交哈希(id) 第二步 查看到上述所有的提交记录后,有如下方法去回退 方法1:--hard 确定上一次提交的哈希值 git reset…

RK3568笔记三十八:DS18B20驱动开发测试

若该文为原创文章,转载请注明原文出处。 DS18B20驱动参考的是讯为电子的单总线驱动第十四期 | 单总线_北京迅为的博客-CSDN博客 博客很详细,具体不描述。 只是记录测试下DS18B20读取温度。 一、介绍 流程基本和按键驱动差不多,主要功能是…