Redis 内存优化

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.rhkb.cn/news/38411.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python设计模式 - 适配器模式

定义 适配器模式&#xff08;Adapter Pattern&#xff09;是一种结构型设计模式&#xff0c;它用于将一个类的接口转换为客户端所期待的另一个接口。 注&#xff1a;在适配器模式定义中所提及的接口是指广义的接口&#xff0c;它可以表示一个方法或者一组方法的集合。 结构 …

Word中公式自动标号带章节编号

&#xff08;1&#xff09;插入一行三列的表格&#xff0c;设置宽度分别为0.5&#xff0c;13.39和1.5&#xff0c;设置纵向居中&#xff0c;中间列居中对齐&#xff0c;最右侧列靠右对齐&#xff0c;设置段落如下 &#xff08;2&#xff09;插入域代码 【Word】利用域代码快速实…

OSASIS(One-Shot Structure-Aware Stylized Image Synthesis)

文章目录 摘要abstract论文摘要方法损失函数实验结论 总结 摘要 本周阅读了一篇关于新型图像风格化的论文《One-Shot Structure-Aware Stylized Image Synthesis》&#xff0c;旨在解决现有GAN模型在风格化过程中难以保持输入图像结构的问题。通过分离图像的结构和语义信息&am…

优先队列 priority_queue详解

说到&#xff0c;priority_queue优先队列。必须先要了解啥是堆与运算符重载(我在下方有解释)。 否则只知皮毛&#xff0c;极易忘记寸步难行。 但在开头&#xff0c;还是简单的说下怎么用 首先&#xff0c;你需要调用 #include <queue> 在main函数中&#xff0c;声明…

Matplotlib

一、Matplotlib快速入门 学习目标 了解什么是matplotlib 为什么要学习matplotlib matplotlib简单图形的绘制 1、什么是Matplotlib 是专门用于开发2D图表(包括3D图表) 以渐进、交互式方式实现数据可视化 2、为什么要学习Matplotlib 可视化是在整个数据挖掘的关键辅助工…

【leetcode hot 100 131】分割回文串

解法一&#xff1a;回溯法动态规划法 回溯法&#xff1a; 假设我们当前搜索到字符串的第 i 个字符&#xff0c;且 s[0…i−1] 位置的所有字符已经被分割成若干个回文串&#xff0c;并且分割结果被放入了答案数组 ans 中&#xff0c;那么我们就需要枚举下一个回文串的右边界 j…

ToDesk云电脑各类鼠标有什么区别?虚拟/3D/游戏鼠标等各有利

不知道各位在使用ToDesk云电脑的时候是否是有注意到&#xff0c;这其中的鼠标竟有多种名称、多种模式可以选&#xff0c;比如锁定鼠标、3D鼠标、游戏鼠标这几项。 那么这些不同名称的鼠标都代表什么意思呐&#xff0c;又应该怎么选择、怎么用呐&#xff1f;本篇内容小编就为大…

手机怎么换网络IP有什么用?操作指南与场景应用‌

在数字化时代&#xff0c;手机已经成为我们日常生活中不可或缺的一部分&#xff0c;无论是工作、学习还是娱乐&#xff0c;手机都扮演着至关重要的角色。而在手机的使用过程中&#xff0c;网络IP地址作为设备在互联网上的唯一标识符&#xff0c;其重要性和作用不容忽视。本文将…

Bulk Rename Utility(BRU)——大批量重命名实用程序

Bulk Rename Utility&#xff08;BRU&#xff09;——大批量重命名实用程序 博主要给博客网站搞博客封面&#xff0c;几百张图没编号&#xff0c;一弄这个就好了&#xff0c;亲测十分好用&#xff0c;下面的b站教程更是一绝&#xff0c;快快使用起来 文章目录 Bulk Rename Ut…

鸿蒙生态开发

鸿蒙生态开发概述 鸿蒙生态是华为基于开源鸿蒙&#xff08;OpenHarmony&#xff09;构建的分布式操作系统生态&#xff0c;旨在通过开放共享的模式连接智能终端设备、操作系统和应用服务&#xff0c;覆盖消费电子、工业物联网、智能家居等多个领域。以下从定义与架构、核心技术…

Matlab概率区间预测全家桶更新了,新增光伏出力区间预测,4种分布可供预测

基本介绍 适用于matlab2020及以上。可任意选择置信区间&#xff0c;区间覆盖率picp、区间平均宽度百分比等等&#xff0c;可用于预测不确定性&#xff0c;效果如图所示&#xff0c;采用KDE&#xff0c;4种分布进行预测&#xff0c;有对比&#xff0c;可以替换成自己的数据。 …

C语言【文件操作】详解中(会使用fgetc,fputc,fgets,fputs,fscanf,fprintf,fread,fwrite函数)

引言 介绍和文件操作中文件的顺序读写相关的函数 看这篇博文前&#xff0c;希望您先仔细看一下这篇博文&#xff0c;理解一下文件指针和流的概念&#xff1a;C语言【文件操作】详解上-CSDN博客文章浏览阅读606次&#xff0c;点赞26次&#xff0c;收藏4次。先整体认识一下文件是…

深入剖析Java虚拟机(JVM):从零开始掌握Java核心引擎

&#x1f4cc; 引言&#xff1a;为什么每个Java开发者都要懂JVM&#xff1f; 想象你是一名赛车手&#xff0c;Java是你的赛车&#xff0c;而JVM就是赛车的引擎。 虽然你可以不关心引擎内部构造就能开车&#xff0c;但要想在比赛中获胜&#xff0c;必须了解引擎如何工作&#…

鸿蒙harmonyOS笔记:练习CheckBoxGroup获取选中的值

除了视觉效果实现全选和反选以外&#xff0c;咱们经常需要获取选中的值&#xff0c;接下来看看如何实现。 核心步骤&#xff1a; 1. 给 CheckBoxGroup 注册 onChange。 2. CheckBox 添加 name 属性。 3. 在 onChange 的回调函数中获取 选中的 name 属性。 事件&#xff1a…

通俗易懂搞懂@RequestParam 和 @RequestBody

&#x1f4cc; 博主简介: &#x1f4bb; 努力学习的 23 级科班生一枚 &#x1f680;&#x1f3e0; 博主主页 &#xff1a; &#x1f4ce; 灰阳阳&#x1f4da; 往期回顾 &#xff1a;Session和Cookie我不允许你不懂&#x1f4ac; 每日一言&#xff1a; 「流水不争先&#xff0c…

Flink 内存管理

一、内存模型 上图是一个 Flink 程序进程总体的内存模型,其包含 Flink 使用内存、JVM 元空间以及 JVM 开销。 Flink 使用了堆上内存和堆外内存;框架内存使用了堆上内存和堆外内存的直接内存;Task 使用堆上内存和堆外内存的直接内存;管理内存、JVM 元空间以及 JVM 内存开销使…

【工具变量】中国各地级市是否属于“信息惠民国家试点城市”匹配数据(2010-2024年)

数据来源&#xff1a;国家等12部门联合发布的《关于加快实施信息惠民工程有关工作的通知》 数据说明&#xff1a;内含原始文件和匹配结果&#xff0c;当试点城市在2014年及以后&#xff0c;赋值为1&#xff1b;试点城市在2014年之前或该城市从未实施信息惠民试点工程&#x…

git的底层原理

git的底层原理 三段话总结git&#xff0c; 1. 工作原理&#xff1a;git管理是一个DAG有向无环图&#xff0c;HEAD指针指向branch或直接指向commit&#xff0c;branch指向commit&#xff0c;commit指向tree&#xff0c;tree指向别的tree或直接指向blob。 2. git所管理的一个目录…

安装React开发者工具

我们在说组件之前&#xff0c;需要先安装一下React官方推出的开发者工具&#xff0c;首先我们分享在线安装方式 首先打开谷歌网上应用商店(针对谷歌浏览器)&#xff0c;在输入框内搜索react&#xff0c;安装如下插件&#xff1a; 注意安装提供方为Facebook的插件&#xff0c;这…

排列与二进制

#include<iostream> using namespace std; int count_two(int n,int m){int count0;for(int i0;i<m;i){ //统计2的因子个数 int numn-i;while(num%20){count;num /2;}}return count; } int main(){int n,m;while(1){cin >> n >> m;if(n0 && m0)br…