Redis 内存优化

news2025/3/24 20:02:01

Redis 内存优化

Redis性能优化可以从多个方面进行,主要包括以下几个方面:


1. 内存优化

Redis 是基于内存的数据库,优化内存使用可以提高性能并降低成本。

(1) 使用合适的数据结构

不同的数据结构占用的内存不同,选择合适的数据结构可以减少内存使用:

  • 字符串(String):适用于存储简单键值对,避免存储过长的字符串。
  • 列表(List):适用于有序集合,避免存储超长的列表。
  • 哈希(Hash):适用于存储对象,如果字段较少,推荐使用 Hash 结构而不是多个 String。
  • 集合(Set)有序集合(Sorted Set):适用于去重或排序的场景。

(2) 开启内存压缩

对于 Hash、List、Set、Zset 这类数据结构,Redis 提供了 ziplist(压缩列表)优化:

  • 调整 hash-max-ziplist-entrieshash-max-ziplist-value
  • 调整 list-max-ziplist-entrieslist-max-ziplist-value
  • 调整 set-max-intset-entries
  • 调整 zset-max-ziplist-entrieszset-max-ziplist-value

合理调整这些参数可以减少内存占用。

(3) 减少键名和字段名长度

  • Redis 的键名不宜过长,例如 user:12345:profile:age 可以改成 u:12345:p:a,减少内存占用。

(4) 使用共享对象

  • 在 Redis 内部,对于小整数(如 0-9999),会使用共享对象来节省内存。
  • 通过 set maxclients 10000 限制最大连接数,避免消耗过多内存。

2. CPU 优化

Redis 是单线程的(除非使用 IO threads),优化 CPU 主要从以下几方面入手:

(1) 避免使用耗时操作

  • 避免 KEYS 命令:使用 SCAN 命令代替,可以减少阻塞时间。
  • 避免 FLUSHALL/FLUSHDB:在大数据量下操作会导致阻塞,可以使用 UNLINK(异步删除)。
  • 避免 LRANGE 0 -1:可以分页 LRANGE start stop 读取数据。
  • 避免 SORT:尽量使用 ZSET 代替 SORT

(2) 使用 Pipelining

如果需要一次性发送多个命令,可以使用 管道(pipelining),减少网络 I/O 和 CPU 解析开销。

(3) 开启 IO Threads

在 Redis 6.0 之后,支持 io-threads,可以开启多线程 I/O 处理:

io-threads 4

这在 高并发请求场景 下可以提高性能。


3. 磁盘 IO 优化

对于持久化模式(RDB 和 AOF),优化磁盘 IO 也能提升性能。

(1) RDB(快照)优化

  • 合理设置 save 规则

    :避免 Redis 频繁生成快照,增加 CPU 和 IO 负担:

    save 900 1
    save 300 10
    save 60 10000
    
  • 关闭 RDB 自动保存

    (如果只使用 AOF 持久化):

    save ""
    
  • 使用 SSD 代替 HDD 以加快 RDB 持久化速度。

(2) AOF(Append Only File)优化

  • 使用 everysec 模式

    (默认),避免

    fsync
    

    频繁写入影响性能:

    appendfsync everysec
    
  • 定期进行 AOF 重写

    ,防止 AOF 文件过大:

    auto-aof-rewrite-percentage 100
    auto-aof-rewrite-min-size 64mb
    
  • 使用 no-appendfsync-on-rewrite yes

    避免 AOF 重写时同步写磁盘,减少性能影响:

    no-appendfsync-on-rewrite yes
    

4. 网络优化

在高并发场景下,优化网络可以减少 Redis 处理请求的延迟。

(1) 调整 tcp-backlog

默认的 tcp-backlog 可能过小,可以增大该值:

tcp-backlog 511

避免高并发时连接被拒绝。

(2) 开启 tcp-keepalive

可以减少 Redis 处理大量 TIME_WAIT 连接:

tcp-keepalive 60

(3) 使用 UNIX Socket

如果 Redis 只用于本机服务,可以使用 UNIX socket,减少 TCP 开销:

unixsocket /var/run/redis.sock
unixsocketperm 700

然后用 redis-cli -s /var/run/redis.sock 连接。


5. 负载均衡和集群优化

当 Redis 单节点性能达到瓶颈时,可以考虑使用 主从架构分片(Sharding)集群(Cluster) 进行扩展。

(1) 使用主从复制

Redis 支持 主从复制(Replication),可以通过 slaveof 配置多个从节点,分摊读压力:

replicaof <master-ip> <master-port>

然后让应用程序将读请求分发到从节点。

(2) 使用 Redis Sentinel 进行高可用

Redis Sentinel 监控主从状态,自动进行主从切换,提升 Redis 可用性:

sentinel monitor mymaster 127.0.0.1 6379 2
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 60000

(3) 使用 Redis Cluster 进行分片

当单机 Redis 容量或并发达到瓶颈时,可以使用 Redis Cluster 进行分片:

redis-cli --cluster create 192.168.1.1:6379 192.168.1.2:6379 192.168.1.3:6379 --cluster-replicas 1

这样数据会被分片存储在多个节点,提升存储能力和并发处理能力。


6. 其他优化

(1) 限制最大内存

防止 Redis 占用过多内存,可以配置 maxmemory

maxmemory 2gb
maxmemory-policy allkeys-lru

选择合适的淘汰策略(如 allkeys-lru)。

(2) 限制最大客户端连接数

防止 Redis 被大量连接占满:

maxclients 10000

(3) 监控 Redis 性能

使用 INFO 命令监控 Redis 运行状态:

redis-cli INFO

或者使用 slowlog 监控慢查询:

redis-cli SLOWLOG GET 10

总结

优化方向具体措施
内存优化使用合适的数据结构、压缩列表、缩短键名、开启共享对象
CPU 优化避免耗时操作(如 KEYS、FLUSHALL)、使用 Pipelining、开启 IO 线程
磁盘 IO调整 RDB/AOF 策略、开启 AOF rewrite、使用 SSD
网络优化调整 tcp-backlog、使用 UNIX Socket、开启 tcp-keepalive
负载均衡主从复制、Redis Sentinel、Redis Cluster
其他优化限制 maxmemorymaxclients,监控 Redis 性能

这些优化可以帮助 Redis 在不同场景下更高效地运行,提高整体性能和稳定性。

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

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

相关文章

数据库设计-笔记2

1.介绍一下MySQL 历史与发展 MySQL 最初由瑞典的 MySQL AB 公司开发&#xff0c;于 1995 年正式发布。2008 年&#xff0c;MySQL AB 公司被 Sun Microsystems 收购&#xff0c;之后 Sun 又被甲骨文&#xff08;Oracle&#xff09;公司收购&#xff0c;MySQL 成为 Oracle 旗下…

损失函数理解(二)——交叉熵损失

损失函数的目的是为了定量描述不同模型&#xff08;例如神经网络模型和人脑模型&#xff09;的差异。 交叉熵&#xff0c;顾名思义&#xff0c;与熵有关&#xff0c;先把模型换成熵这么一个数值&#xff0c;然后用这个数值比较不同模型之间的差异。 为什么要做这一步转换&…

基于随机森林回归预测葡萄酒质量

基于随机森林回归预测葡萄酒质量 1.作者介绍2.随机森林算法与数据集介绍2.1定义2.2核心思想2.3主要步骤2.4数据集介绍 3.算法实现3.1数据加载与探索3.2数据可视化3.3数据预处理&#xff08;标准化、划分训练/测试集&#xff09;3.4模型训练与优化&#xff08;随机森林回归 超参…

【Qt】QWidget属性2

&#x1f3e0;个人主页&#xff1a;Yui_ &#x1f351;操作环境&#xff1a;Qt Creator &#x1f680;所属专栏&#xff1a;Qt 文章目录 1. windowOpacity属性2. cursor属性2.1 自定义光标 3. font属性4.tooltip属性5. focusPolicy属性6. 总结 由于QWidget的常见属性实在太多&a…

OpenGL ES ->乒乓缓冲,计算只用两个帧缓冲对象(Frame Buffer Object)+叠加多个滤镜作用后的Bitmap

乒乓缓冲核心思想 不使用乒乓缓冲&#xff0c;如果要每个滤镜作用下的绘制内容&#xff0c;也就是这个滤镜作用下的帧缓冲&#xff0c;需要创建一个Frame Buffer Object加上对应的Frame Buffer Object Texture使用乒乓缓冲&#xff0c;只用两个Frame Buffer Object加上对应的F…

数据库练习2

目录 1.向heros表中新增一列信息&#xff0c;添加一些约束&#xff0c;并尝试查询一些信息 2.课堂代码练习 3.题目如下 一、单表查询 1、显示所有职工的基本信息。 2、查询所有职工所属部门的部门号&#xff0c;不显示重复的部门号。 3、求出所有职工的人数。 4…

macOS Sequoia 15.3 一直弹出“xx正在访问你的屏幕”

&#x1f645; 问题描述 macOS 系统升级后&#xff08;15.2或者15.3均出现过此问题&#xff09;&#xff0c;不管是截图还是开腾讯会议&#xff0c;只要跟捕捉屏幕有关&#xff0c;都一直弹出这个选项&#xff0c;而且所有软件我都允许访问屏幕了&#xff0c;这个不是询问是否…

C# 调用 VITS,推理模型 将文字转wav音频调试 -数字人分支

Microsoft.ML.OnnxRuntime.OnnxRuntimeException: [ErrorCode:InvalidArgument] Input name: input_name is not in the metadata在 Microsoft.ML.OnnxRuntime.InferenceSession.LookupInputMetadata(String nodeName) 位置 D:\a\_work\1\s\csharp\src\Microsoft.ML.OnnxRuntim…

【Docker系列一】Docker 简介

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

C++进阶——封装红黑树实现map和set

目录 1、源码及框架分析 2、模拟实现map和set 2.1 复用的红黑树框架及Insert 2.2 iterator的实现 2.2.1 iterator的核心源码 2.2.2 iterator的实现思路 2.3 map支持[ ] 2.4 map和set的代码实现 2.4.1 MyMap.h 2.4.2 MySet.h 2.4.3 RBTree.h 2.4.4 Test.cpp 1、源码及…

‘闭包‘, ‘装饰器‘及其应用场景

‘闭包’, 装饰器’及其应用场景 一, 闭包及其应用场景 图解 闭包的定义 概述: 内部函数 使用了 外部函数 的变量, 这种写法就称之为闭包. 格式: def 外部函数名(形参列表):外部函数的(局部)变量def 内部函数名(形参列表):内部函数的(局部)变量return 内部函数名前提条件: …

IDEA 快捷键ctrl+shift+f 无法全局搜索内容的问题及解决办法

本篇文章主要讲解IDEA、phpStrom、webStrom、pyCharm等jetbrains系列编辑器无法进行全局搜索内容问题的主要原因及解决办法。 日期&#xff1a;2025年3月22日 作者&#xff1a;任聪聪 现象描述&#xff1a; 1.按下ctrlshiftf 输入法转为了繁体。 2.快捷键ctrlshiftr 可以全局检…

Powershell WSL导出导入ubuntu22.04.5子系统

导出Linux子系统 导出位置在C盘下,根据自己的实际情况更改即可Write-Host "export ubuntu22.04.5" -ForegroundColor Green wsl --export Ubuntu-22.04 c:\Ubuntu-22.04.tar 导入Linux子系统 好处是目录可用在任意磁盘路径,便于迁移不同的设备之间Write-Host &quo…

论文笔记(七十三)Gemini Robotics: Bringing AI into the Physical World

Gemini Robotics: Bringing AI into the Physical World 文章概括1. 引言2. Gemini 2.0的具身推理2.1. 具身推理问答&#xff08;ERQA&#xff09;基准测试2.2. Gemini 2.0的具身推理能力2.3. Gemini 2.0支持零样本和少样本机器人控制 3. 使用 Gemini Robotics 执行机器人动作3…

AI + 医疗 Qwq大模型离线本地应用

通义千问Qwq-32b-FP16可用于社区医院、乡镇卫生院、诊所等小型医疗机构&#xff0c;替代专业合理用药系统&#xff0c;作为药品知识库&#xff0c;实现以下功能&#xff1a; 药品信息智能查询&#xff1a;检索药品的详细说明书、适应症、禁忌症、不良反应及药物相互作用等关键信…

元音辅音及其字母组合发音

文章目录 单元音长元音/ɑː//ɔ://u://i://ɜː/// 短元音/ʌ//ɒ//ʊ//ɪ//ə//e/ 双元音/eɪ//aɪ//ɔɪ//ɪə//eə//ʊə//əʊ//aʊ/ 辅音3个鼻辅音m n ŋ 5个独立浊辅音w j r l h 20个清浊相对的辅音s zʃ ʒf vθ p bt dk gts dztʃ dʒtr dr 以下是列举的部分字母组合…

【Vitis AIE】FPGA图像处理 11 双线性插值 Bilinear Interpolation

双线性插值 https://github.com/Xilinx/Vitis-Tutorials/tree/2024.2/AI_Engine_Development/AIE/Design_Tutorials/11-Bilinear_Interpolation 简介 双线性插值是一种使用重复线性插值来插值两个变量函数的方法。它通常用于以下应用&#xff1a; 图像处理和计算机视觉&…

Linux | 安装 Samba将ubuntu 的存储空间指定为windows 上的一个磁盘

01 安装 samba 文件来实现。比如把我们 ubuntu 的存储空间指定为我们 windows 上的一个磁盘,然后我们在这个磁盘里面创建 .c 文件,进行我们代码的修改和编写,可以安装 samba 文件来实现。 samba 是一种网络共享服务,可以通过网络访问我们指定的文件夹 02 第一步:下…

一文说清预训练与微调:AI的双重训练法则

什么是预训练&#xff1f; 预训练是大型语言模型训练的第一步。它在资金和计算能力的支持下&#xff0c;通过深入分析大量的文本数据&#xff0c;使模型建立起语言的基本构架。在这一阶段&#xff0c;模型通过学习海量的书籍、文章和网页&#xff0c;识别出语言的语法、句法和…

996引擎-接口测试:音效测试NPC

996引擎-接口测试:音效测试NPC 参考资料local offset = 1 -- 默认偏移量function main(player, newOffset)offset = newOffset or offset -- 更新偏移量local buttonWidth =