当前位置: 首页 > news >正文

Redis的持久化以及性能管理

目录

一、Redis持久化概述

1.什么是Redis持久化

2.持久化方式 

3.RDB持久化

3.1概念

3.2触发条件

3.3执行流程 

3.4启动时加载 

4. AOF持久化

4.1概念

4.2启动AOF

4.3执行流程 

4.4启动时加载 

5.RDB和AOF的优缺点 

二、Redis性能管理 

1.查看Redis内存使用

2.内存碎片率 

2.1定义

2.2内存碎片的来源 

2.3监测内存碎片率的重要性 

2.4优化建议 

3.内存使用率 

3.1定义

3.2避免内存交换发生的方法

3.3监控和优化

4.内存回收key

4.1内存回收策略

4.2配置最大内存策略

4.3可用的回收策略

4.4实施建议


一、Redis持久化概述

1.什么是Redis持久化

Redis 是一个内存数据库,数据存储在内存中,为了避免因意外断电等原因导致数据丢失,Redis 提供了持久化功能,可以将内存中的数据定期保存到硬盘上

2.持久化方式 

一、RDB持久化(快照持久化)

①定期将内存中的数据生成快照并保存为二进制文件(.rdb)
②可以手动触发(`SAVE` 或 `BGSAVE`),也可以根据配置的时间和操作次数自动触发

二、AOF持久化(追加文件持久化)

①记录每个写操作的日志,将这些命令追加到文件(.aof)中
②Redis 重启时,通过执行 AOF 文件中的命令恢复数据
③支持多种同步策略,以平衡性能和数据安全性

3.RDB持久化

3.1概念

RDB 持久化是指在指定时间间隔内将内存中的数据生成快照,并保存到硬盘中(因此也称为快照持久化)。它使用二进制压缩格式存储,生成的文件后缀为 `.rdb`。当 Redis 重新启动时,可以读取该快照文件来恢复数据。这种方式的优点是性能较高,适合大规模数据恢复,但可能导致在最后一次快照后产生的数据丢失

3.2触发条件

手动触发:
save命令:

会生成 RDB 文件,但会阻塞 Redis 服务器进程,直到文件创建完成。在此期间,服务器无法处理任何命令请求,基本已被废弃
bgsave:

会创建一个子进程来生成 RDB 文件,父进程继续处理请求。虽然在子进程创建时会短暂阻塞,但整体上不会影响主进程,因此在生产环境中推荐使用 BGSAVE

自动触发:
自动触发的 RDB 持久化同样优先使用 BGSAVE。可以在配置文件中通过 `save m n` 指定触发条件

可在配置文件里修改参数

vim /etc/redis/6379.conf
--219行--以下三个save条件满足任意一个时,都会引起bgsave的调用
save 900 1 :当时间到900秒时,如果redis数据发生了至少1次变化,则执行bgsave
save 300 10 :当时间到300秒时,如果redis数据发生了至少10次变化,则执行bgsave
save 60 10000 :当时间到60秒时,如果redis数据发生了至少10000次变化,则执行bgsave
--254行--指定RDB文件名
dbfilename dump.rdb
--264行--指定RDB文件和AOF文件所在目录
dir /var/lib/redis/6379
--242行--是否开启RDB文件压缩
rdbcompression yes

3.3执行流程 

1. 父进程检查:
Redis 父进程首先检查当前是否正在执行 SAVE、BGSAVE 或 BGREWRITEAOF。如果正在执行,BGSAVE 命令将直接返回,不会启动新的子进程。这是为了避免并发的子进程同时进行大量磁盘写操作,从而引起性能问题

2. 创建子进程:
如果没有其他持久化操作正在进行,父进程会执行 fork 操作来创建子进程。在此过程中,父进程会阻塞,无法处理来自客户端的任何命令

3. 返回信息:
 一旦成功 fork 后,BGSAVE 命令返回“Background saving started”信息,父进程解除阻塞,可以继续响应其他命令

4. 子进程创建 RDB 文件:
子进程负责根据父进程的内存快照生成 RDB 文件。它会创建一个临时快照文件,完成后通过原子操作替换旧的 RDB 文件

5. 完成信号:
子进程在完成 RDB 文件的生成后,会向父进程发送信号,表示持久化操作已完成。父进程接收到信号后,会更新相关的统计信息

3.4启动时加载 

1. 自动加载:
RDB 文件的加载在 Redis 服务器启动时自动执行,无需专门命令

2. 优先级:
当 AOF(Append-Only File)开启时,Redis 优先加载 AOF 文件以恢复数据。只有在 AOF 关闭的情况下,Redis 才会检测并加载 RDB 文件

3. 阻塞状态:
在加载 RDB 文件期间,Redis 服务器会处于阻塞状态,无法处理任何客户端请求,直到加载完成

4. 文件校验:
Redis 在载入 RDB 文件时,会进行文件完整性校验。如果发现文件损坏,会在日志中记录错误,并导致 Redis 启动失败

4. AOF持久化

4.1概念

AOF(Append-Only File)持久化是 Redis 的一种数据持久化机制,它将 Redis 执行的每次写入和删除命令记录到一个单独的日志文件中。与 RDB 持久化将进程数据快照写入文件不同,AOF 只记录变更操作,而查询操作则不会被记录

4.2启动AOF

开启AOF持久化需要修改配置文件
vim /etc/redis/6379.conf
--700行--修改,开启AOF
appendonly yes
--704行--指定AOF文件名称
appendfilename "appendonly.aof"
--796行--是否忽略最后一条可能存在问题的指令
aof-load-truncated yes重启Redis服务器使配置生效
/etc/init.d/redis_6379 restart

4.3执行流程 

1. 命令追加 (Append)

写命令追加
①Redis 将接收到的每个写入和删除命令追加到缓冲区 `aof_buf` 中,而不是直接写入磁盘。这种方式减少了频繁的硬盘 I/O 操作,提高了性能
②命令以 Redis 协议的文本格式存储,确保兼容性和可读性

2. 文件写入 (Write) 和文件同步 (Sync)
同步策略
Redis 提供了三种 AOF 缓存区的同步策略:

①appendfsync always:
每次写命令后,立即调用 fsync 同步到 AOF 文件,确保数据安全,但会降低性能

②appendfsync no:
写入后仅调用 write,不进行 fsync 同步,由操作系统负责。这种方式性能较好,但数据安全性较差

③appendfsync everysecond(默认):
写入后调用 write,然后每秒由专门的线程调用一次 fsync。这种方式在性能与数据安全性之间取得平衡,是推荐的配置

3. 文件重写 (Rewrite)
定期重写:
为防止 AOF 文件过大,Redis 定期进行 AOF 文件重写。它会生成一个新的压缩版本,保留必要的写命令,从而减少磁盘占用

4.4启动时加载 

主要特点

1. 优先加载 AOF:
Redis启动时会检查 AOF 文件。如果 AOF 文件存在且有效,Redis 将优先使用它来恢复数据

2. AOF 文件不存在时的行为:
如果 AOF 文件开启但不存在,即使 RDB 文件存在,Redis 也不会加载 RDB 文件

3. 文件校验:
Redis 在加载 AOF 文件时,会对文件进行校验。如果发现文件损坏,启动将失败,并在日志中记录错误信息

4. 不完整的 AOF 文件:
如果 AOF 文件的结尾不完整(如因为机器突然宕机导致),但 `aof-load-truncated` 参数开启(默认开启),Redis 会忽略 AOF 文件的尾部数据,并成功启动,同时在日志中输出警告

配置参数

aof-load-truncated:
该参数控制在 AOF 文件尾部不完整时的行为。开启时,Redis 会在启动时忽略不完整的部分,确保能继续运行;关闭时,Redis 将因文件损坏而无法启动

5.RDB和AOF的优缺点 

RDB持久化
优点:
①文件紧凑,体积小,传输快,适合全量复制
②恢复速度快
③对性能影响较小

缺点:
①不支持实时持久化,数据丢失风险较高
②兼容性差,旧版本Redis可能无法读取新版本RDB文件
③在执行bgsave时,主进程会被阻塞,IO压力增大

AOF持久化
优点:
①支持秒级持久化,能更好地保护数据
②兼容性好,容易与不同版本的Redis配合使用

缺点:
①文件体积较大,恢复速度慢
②对性能影响大,频繁写入导致IO压力增加,可能引发AOF追加阻塞问题
③类似于RDB的重写过程也会导致阻塞和IO压力

二、Redis性能管理 

1.查看Redis内存使用

登录到redis数据库,然后查看redis内存使用情况
redis-cli -h 172.16.58.10 -p 6379
172.16.58.10:6379> info memory
# Memory
used_memory:853304
used_memory_human:833.30K
used_memory_rss:10510336
used_memory_rss_human:10.02M
used_memory_peak:853304
used_memory_peak_human:833.30K
used_memory_peak_perc:100.01%
used_memory_overhead:841078
used_memory_startup:791384
used_memory_dataset:12226
used_memory_dataset_perc:19.74%
allocator_allocated:1661928
allocator_active:2068480
allocator_resident:9039872
total_system_memory:1911857152
total_system_memory_human:1.78G
used_memory_lua:37888
used_memory_lua_human:37.00K
used_memory_scripts:0
used_memory_scripts_human:0B
number_of_cached_scripts:0
maxmemory:0
maxmemory_human:0B
maxmemory_policy:noeviction
allocator_frag_ratio:1.24
allocator_frag_bytes:406552
allocator_rss_ratio:4.37
allocator_rss_bytes:6971392
rss_overhead_ratio:1.16
rss_overhead_bytes:1470464
mem_fragmentation_ratio:12.94
mem_fragmentation_bytes:9698056
mem_not_counted_for_evict:0
mem_replication_backlog:0
mem_clients_slaves:0
mem_clients_normal:49694
mem_aof_buffer:0
mem_allocator:jemalloc-5.1.0
active_defrag_running:0
lazyfree_pending_objects:0

2.内存碎片率 

2.1定义

内存碎片率 = used_memory_rss / used_memory,其中:
①used_memory_rss:Redis 实例所占的物理内存,包括内存碎片
②used_memory:Redis 实际使用的内存总量

2.2内存碎片的来源 

内存碎片是由于操作系统在分配和回收内存时未能有效利用物理内存导致的,尤其是在需要分配大块连续内存时

2.3监测内存碎片率的重要性 

合理范围:
①稍大于1:表示内存碎片较低,Redis 性能良好
②超过1.5:表示内存使用效率低,需采取措施(如重启 Redis)
③低于1:表示内存分配超出物理内存,操作系统在进行交换,需增加物理内存或优化 Redis 内存使用

2.4优化建议 

①定期监控内存碎片率,使用 redis-cli 进行性能分析
②在内存碎片率较高时,考虑使用SHUTDOWN SAVE命令重启Redis实例,以清理内存碎片
③如果碎片率长期较高,可能需要优化数据结构或配置 Redis 的内存管理策略

3.内存使用率 

3.1定义

当 Redis 实例的内存使用率超过可用的最大内存时,操作系统将开始使用交换空间(swap),这可能导致性能下降

3.2避免内存交换发生的方法

1. 根据缓存数据大小选择 Redis 实例:
在部署 Redis 时,确保实例的内存配置足以容纳预期的数据量,避免内存超限

2. 使用 Hash 数据结构:
Hash 数据结构比其他数据结构(如字符串或列表)更有效地利用内存,特别是在存储多个字段的数据时,能减少内存开销

3. 设置 Key 的过期时间:
通过设置适当的过期时间,确保不再使用的数据能及时被清理,从而释放内存,降低内存使用率

3.3监控和优化

①定期监控内存使用情况:

使用 INFO memory 命令查看内存使用率,及时发现潜在问题
②调整 Redis 配置:根据实际使用情况,考虑调整最大内存配置或优化数据存储方式,以减少内存占用 

4.内存回收key

4.1内存回收策略

内存清理策略旨在合理分配 Redis 的有限内存资源,当达到设置的最大内存阈值时,必须选择一种策略来回收键(key)

4.2配置最大内存策略

配置最大内存策略
在配置文件 /etc/redis/6379.conf 中,可以修改 maxmemory-policy 属性来设定内存回收策略。默认情况下,策略是 noeviction,即禁止删除数据

4.3可用的回收策略

1. volatile-lru:
使用最近最少使用(LRU)算法从设置了过期时间的键中淘汰数据。主要针对那些设置了 TTL 的键

2. volatile-ttl:
从已设置过期时间的键中挑选即将过期的键进行淘汰,优先移除即将过期的键

3. volatile-random:
随机选择设置了过期时间的键进行淘汰,适用于那些设置了 TTL 的键

4. allkeys-lru:
使用 LRU 算法从所有键中淘汰数据,而不仅限于设置了过期时间的键

5. allkeys-random:
随机从所有键中选择数据进行淘汰,适用于任意键

6. noeviction:
禁止淘汰数据。若内存达到最大阈值,后续的写入操作将返回错误

4.4实施建议

①选择合适的策略:

根据应用场景选择最适合的回收策略,确保系统性能与数据存储需求的平衡
②定期监控:

监控内存使用情况,确保选择的策略能够有效管理内存,避免出现内存溢出或性能下降的情况

相关文章:

Redis的持久化以及性能管理

目录 一、Redis持久化概述 1.什么是Redis持久化 2.持久化方式 3.RDB持久化 3.1概念 3.2触发条件 3.3执行流程 3.4启动时加载 4. AOF持久化 4.1概念 4.2启动AOF 4.3执行流程 4.4启动时加载 5.RDB和AOF的优缺点 二、Redis性能管理 1.查看Redis内存使用 2…...

Docker部署Meta-Llama-3.1-70B-Instruct API openai格式,vLLM速度对比

下载模型 modelscope环境,国内下载更快: conda create -n modelscope python=3.10 conda activate modelscopepip install modelscope命令行下载: https://modelscope.cn/models/LLM-Research/Meta-Llama-3.1-70B-Instruct modelscope download --model LLM-Research/Met…...

USB协议学习

文章目录 USB发展背景发展变化速度等级通讯接口 四种传输主设备 & 从设备主设备从设备 连接与检测高速设备与主机连接USB总线常见的几种状态 枚举过程特点 控制传输学习资料 USB发展背景 发展变化 USB1.1:规范了USB低全速传输; USB2.0:…...

TDengine 数据订阅 vs. InfluxDB 数据订阅:谁更胜一筹?

在时序数据的应用场景中,数据的实时消费和处理能力成为衡量数据库性能和可用性的重要指标。TDengine 和 InfluxDB 作为时序数据库(Time Series Database)中的佼佼者,在数据订阅方面各有特点。但从架构设计、灵活性和系统负载上看&…...

用户批评 SAP 的人工智能战略

在2024年德语SAP用户组织(DSAG)年会上,SAP用户对公司云优先的AI创新策略表示不满。SAP决定将AI功能仅限于云客户,使使用本地部署(on-premises)系统的用户感到被忽视。这种“云优先”策略引发了SAP用户间的广…...

Jest进阶知识:React组件的单元测试

在现代前端开发中,组件是构建应用程序的基本单元。一个组件不仅拥有完整的功能,还能极大地提高代码的复用性。因此,在进行单元测试时,对重要组件进行测试是必不可少的。 Testing Library Testing Library 是一个专门用于测试 We…...

MATLAB——矩阵操作

内容源于b站清风数学建模 数学建模清风老师《MATLAB教程新手入门篇》https://www.bilibili.com/video/BV1dN4y1Q7Kt/ 目录 1.MATLAB中的向量 1.1向量创建方法 1.2向量元素的引用 1.3向量元素修改和删除 2.MATLAB矩阵操作 2.1矩阵创建方法 2.2矩阵元素的引用 2.3矩阵…...

智能数据驱动的风险管理:正大金融科技的创新实践

在不断变化的金融环境中,风险管理成为投资成功的关键因素。正大公司以数据驱动的智能风控体系为核心,通过深度学习、数据分析等技术创新,帮助投资者在复杂的市场条件下实现稳健操作和风险控制。本文将探讨正大如何利用科技手段提升风险管理效…...

贝尔不等式的验证

在量子计算机上运行一个实验,以演示使用Estimator原型违反CHSH不等式。 import numpy as npfrom qiskit import QuantumCircuit from qiskit.circuit import Parameter from qiskit.quantum_info import SparsePauliOpfrom qiskit_ibm_runtime import QiskitRuntim…...

GR2——在大规模视频数据集上预训练且机器人数据上微调,随后预测动作轨迹和视频(含GR1详解)

前言 上个月的24年10.9日,我在朋友圈看到字节发了个机器人大模型GR2,立马去看了下其论文(当然了,本质是个技术报告) 那天之后,我就一直想解读这个GR2来着 然,意外来了,如此文《OmniH2O——通用灵巧且可全…...

伦敦金价格是交易所公布的吗?

今年以来,伦敦金价格波动可谓是波澜壮阔,盘中屡次刷新历史新高,目前已经冲上了2700的历史大关。面对高歌猛进的伦敦金价格,投资者除了进行交易之外,还有一点相关方面的知识是想了解的。例如,伦敦金价格是交…...

Oracle SQL Loader概念及用法

Oracle SQLLoader是Oracle数据库提供的一个高效的数据加载工具,它能够将外部数据(如CSV、DAT、Text等文件格式)快速加载到Oracle数据库中。以下是对Oracle SQLLoader的详细介绍: 一、主要功能 数据迁移:SQL*Loader常…...

ReactPress 是什么?

ReactPress Github项目地址:https://github.com/fecommunity/reactpress 欢迎Star。 ReactPress 是什么? ReactPress 是使用React开发的开源发布平台,用户可以在支持React和MySQL数据库的服务器上架设属于自己的博客、网站。也可以把 ReactP…...

MR30分布式IO模块与高效PLC协同

在现代工业自动化领域中,数据采集与控制系统扮演着至关重要的角色。其中,可编程逻辑控制器(PLC)和分布式IO模块(Distributed I/O Modules)是这一领域的两大核心组件。本文将详细介绍MR30分布式IO模块与PLC如…...

成都睿明智科技有限公司共赴抖音电商蓝海

在这个短视频风起云涌的时代,抖音作为现象级的社交媒体平台,不仅改变了人们的娱乐方式,更悄然间重塑了电商行业的格局。在这片充满机遇与挑战的蓝海中,成都睿明智科技有限公司凭借其敏锐的市场洞察力和专业的服务能力,…...

Android15音频进阶之音频策略加载及使用(九十一)

简介: CSDN博客专家、《Android系统多媒体进阶实战》一书作者 新书发布:《Android系统多媒体进阶实战》🚀 优质专栏: Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏: 多媒体系统工程师系列【原创干货持续更新中……】🚀 优质视频课程:AAOS车载系统+…...

Spring设值注入

设值注入(Setter Injection)是Spring框架中依赖注入的一种方式,通过Setter方法将依赖对象注入到目标对象中。设值注入在对象创建后,通过调用Setter方法完成依赖注入。 设值注入的优点 灵活性:设值注入允许在对象创建…...

Spring整合Mybatis过程

配置文件 springConfig --> [jdbcConfig mybatisConfig] jdbc配置文件进行基本的数据库连接池配置 mybatis配置文件进行SqlSessionFactory Bean 和 MapperScannerConfigurer Bean的创建 在Spring容器启动时,系统会根据配置创建并初始化所有MyBatis所需的Bean…...

常见HR问题篇

系列文章目录 第一章 C/C语言篇第二章 计算机网络篇第三章 操作系统篇第四章 数据库MySQL篇第五章 数据库Redis篇第六章 场景题/算法题第七篇 常见HR问题篇 本系列专栏:点击进入 后端开发面经 关注走一波 秋招阶段,面过很多大中小厂,积攒了…...

调用数据集mnist(下载+调用全攻略)

1、下载mnist数据集请自取: 通过百度网盘分享的文件:mnist 链接:https://pan.baidu.com/s/1ia3vFA73hEtWK9qU-O-4iQ?pwdmnis 提取码:mnis 下载后把数据集放在没有中文的路径下。 # 本文将下载好的数据集放在C:\DeepLearning\…...

eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)

说明: 想象一下,你正在用eNSP搭建一个虚拟的网络世界,里面有虚拟的路由器、交换机、电脑(PC)等等。这些设备都在你的电脑里面“运行”,它们之间可以互相通信,就像一个封闭的小王国。 但是&#…...

css实现圆环展示百分比,根据值动态展示所占比例

代码如下 <view class""><view class"circle-chart"><view v-if"!!num" class"pie-item" :style"{background: conic-gradient(var(--one-color) 0%,#E9E6F1 ${num}%),}"></view><view v-else …...

【Linux】C语言执行shell指令

在C语言中执行Shell指令 在C语言中&#xff0c;有几种方法可以执行Shell指令&#xff1a; 1. 使用system()函数 这是最简单的方法&#xff0c;包含在stdlib.h头文件中&#xff1a; #include <stdlib.h>int main() {system("ls -l"); // 执行ls -l命令retu…...

STM32标准库-DMA直接存储器存取

文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA&#xff08;Direct Memory Access&#xff09;直接存储器存取 DMA可以提供外设…...

苍穹外卖--缓存菜品

1.问题说明 用户端小程序展示的菜品数据都是通过查询数据库获得&#xff0c;如果用户端访问量比较大&#xff0c;数据库访问压力随之增大 2.实现思路 通过Redis来缓存菜品数据&#xff0c;减少数据库查询操作。 缓存逻辑分析&#xff1a; ①每个分类下的菜品保持一份缓存数据…...

Module Federation 和 Native Federation 的比较

前言 Module Federation 是 Webpack 5 引入的微前端架构方案&#xff0c;允许不同独立构建的应用在运行时动态共享模块。 Native Federation 是 Angular 官方基于 Module Federation 理念实现的专为 Angular 优化的微前端方案。 概念解析 Module Federation (模块联邦) Modul…...

智能仓储的未来:自动化、AI与数据分析如何重塑物流中心

当仓库学会“思考”&#xff0c;物流的终极形态正在诞生 想象这样的场景&#xff1a; 凌晨3点&#xff0c;某物流中心灯火通明却空无一人。AGV机器人集群根据实时订单动态规划路径&#xff1b;AI视觉系统在0.1秒内扫描包裹信息&#xff1b;数字孪生平台正模拟次日峰值流量压力…...

iOS性能调优实战:借助克魔(KeyMob)与常用工具深度洞察App瓶颈

在日常iOS开发过程中&#xff0c;性能问题往往是最令人头疼的一类Bug。尤其是在App上线前的压测阶段或是处理用户反馈的高发期&#xff0c;开发者往往需要面对卡顿、崩溃、能耗异常、日志混乱等一系列问题。这些问题表面上看似偶发&#xff0c;但背后往往隐藏着系统资源调度不当…...

认识CMake并使用CMake构建自己的第一个项目

1.CMake的作用和优势 跨平台支持&#xff1a;CMake支持多种操作系统和编译器&#xff0c;使用同一份构建配置可以在不同的环境中使用 简化配置&#xff1a;通过CMakeLists.txt文件&#xff0c;用户可以定义项目结构、依赖项、编译选项等&#xff0c;无需手动编写复杂的构建脚本…...

C++实现分布式网络通信框架RPC(2)——rpc发布端

有了上篇文章的项目的基本知识的了解&#xff0c;现在我们就开始构建项目。 目录 一、构建工程目录 二、本地服务发布成RPC服务 2.1理解RPC发布 2.2实现 三、Mprpc框架的基础类设计 3.1框架的初始化类 MprpcApplication 代码实现 3.2读取配置文件类 MprpcConfig 代码实现…...