redis-性能下降的原因排查

server/2025/2/24 19:30:38/

问题现象

Redis 响应变慢,查询或写入操作耗时增加。

原因

  • 数据量过大,导致操作复杂度增加。
  • 频繁的大 key 操作(如 HGETALLSMEMBERS)。
  • 网络延迟或带宽不足。
  • Redis 实例负载过高,CPU 或内存资源不足。
  • AOF 或 RDB 持久化操作影响性能。

解决方案

  • 优化大 key:拆分大 key,避免一次性操作大量数据。
  • 使用 Pipeline:将多个命令打包发送,减少网络开销。(如果redis分片,不建议使用)
  • 升级硬件:增加 CPU、内存或网络带宽。
  • 调整持久化策略:根据业务需求调整 AOF 或 RDB 的配置,例如减少 fsync 频率。(从节点做持久化)
  • 监控性能:使用 SLOWLOG 或监控工具分析慢查询。

优化大 key

String类型

  • 使用压缩格式
  • 如果时对象序列化成的字符串,考虑减少对象中的属性
  • 如果是json格式,考虑使用hash存储,需要哪个字段,就查哪个

List、Set、Zset类型

考虑方向:将1个key分散到多个节点

原始大 Key:user:1000:orders,存储了 100 万个订单

拆分后:user:1000:orders:1user:1000:orders:2,每个 Key 存储 1 万个订单。

分片:使用一致性哈希算法,将 user:1000:orders 的数据分布到多个 Redis 实例

Pipeline

作用:将多个命令打包发送,减少网络开销。

package org.example;import org.redisson.Redisson;
import org.redisson.api.*;
import org.redisson.config.Config;import java.util.Arrays;
import java.util.List;public class LuaTest {private static final String KEY = "lock_test";private static final RedissonClient redisson;static {Config config = new Config();config.useSingleServer().setAddress("redis://*****.redis.rds.aliyuncs.com:6379").setUsername("****").setPassword("******");redisson = Redisson.create(config);}public static void main(String[] args) {// 3. 创建 RBatch 实例RBatch batch = redisson.createBatch();// 4. 批量添加 String 类型数据batch.getBucket("stringKey1").setAsync("value1");batch.getBucket("stringKey2").setAsync("value2");// 5. 批量添加 List 类型数据RListAsync<Object> list1 = batch.getList("listKey1");list1.addAllAsync(Arrays.asList("item1", "item2", "item3"));RListAsync<Object> list2 = batch.getList("listKey2");list2.addAllAsync(Arrays.asList("itemA", "itemB", "itemC"));// 6. 执行 RBatchbatch.execute();// 7. 验证结果System.out.println("String Key1: " + redisson.getBucket("stringKey1").get());System.out.println("String Key2: " + redisson.getBucket("stringKey2").get());List<Object> listResult1 = redisson.getList("listKey1").readAll();List<Object> listResult2 = redisson.getList("listKey2").readAll();System.out.println("List Key1: " + listResult1);System.out.println("List Key2: " + listResult2);}}


http://www.ppmy.cn/server/170395.html

相关文章

(二)趣学设计模式 之 工厂方法模式!

目录 一、 啥是工厂方法模式&#xff1f;二、 为什么要用工厂方法模式&#xff1f;三、 工厂方法模式怎么实现&#xff1f;四、 工厂方法模式的应用场景五、 工厂方法模式的优点和缺点六、 总结 &#x1f31f;我的其他文章也讲解的比较有趣&#x1f601;&#xff0c;如果喜欢博…

14.7 LangChain Experimental 模块解析:解锁 Auto-GPT 开发新范式

LangChain Experimental 模块解析:解锁 Auto-GPT 开发新范式 关键词:LangChain Experimental、Auto-GPT 实现、自主智能体开发、Agent 架构设计、实验性功能实践 1. LangChain Experimental 模块的定位与核心能力 模块定位解析: #mermaid-svg-4xz2OlZBUFjkBmqw {font-fami…

C++初阶——简单实现list

目录 1、前言 2、List.h 3、Test.cpp 1、前言 1. 简单实现std::list&#xff0c;重点&#xff1a;迭代器&#xff0c;模板类&#xff0c;运算符重载。 2. 并不是&#xff0c;所有的类&#xff0c;都需要深拷贝&#xff0c;像迭代器类模板&#xff0c;只是用别的类的资源&am…

jvm-Java虚拟机

一.什么是jvm jdk-Java开发工具包 jre-Java运行时环境 jvm-Java虚拟机 像C这样的语言就是直接编译成了二进制的机器指令,不同的cpu上面支持的指令不一样,如果是换了操作系统,可能就会需要重新编码. 而Java就想要只是使用一套编码,在各个操作系统上都是使用一套编码. 我们…

Mac OS JAVA_HOME设置

个人博客地址&#xff1a;Mac OS JAVA_HOME设置 | 一张假钞的真实世界 在MacOS上使用DMG文件安装了Jdk8 之后&#xff0c;在默认路径下找不到JDK的HOME路径&#xff1a; $ which java /usr/bin/java $ ls -l /usr/bin/java lrwxr-xr-x 1 root wheel 74 12 6 2015 /usr/b…

SpringCloud系列教程:微服务的未来(二十五)-基于注解的声明队列交换机、消息转换器、业务改造

前言 在现代分布式系统中&#xff0c;消息队列是实现服务解耦和异步处理的关键组件。Spring框架提供了强大的支持&#xff0c;使得与消息队列&#xff08;如RabbitMQ、Kafka等&#xff09;的集成变得更加便捷和灵活。本文将深入探讨如何利用Spring的注解驱动方式来配置和管理队…

哈希表-两个数的交集

代码随想录-刷题笔记 349. 两个数组的交集 - 力扣&#xff08;LeetCode&#xff09; 内容: 集合的使用 , 重复的数剔除掉&#xff0c;剩下的即为交集&#xff0c;最后加入数组即可。 class Solution {public int[] intersection(int[] nums1, int[] nums2) {Set<Integer…

风险价值VaR、CVaR与ES

风险价值VaR、CVaR与ES 一、VaR风险价值1. VaR的定义及基本概念2.VaR的主要性质3.风险价值的优缺点 二、CVaR条件风险价值与ES预期损失1.CVaR的基本概念2.性质3.ES预期损失 一、VaR风险价值 1. VaR的定义及基本概念 20年前&#xff0c;JP的大佬要每天下午收盘后的4:15在桌上看…