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

redis-性能下降的原因排查

问题现象

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. 执行 RBatch
        batch.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);

    }

}

相关文章:

  • 基于SpringBoot的二手交易系统
  • openharmony中hdf框架的驱动消息机制的实现原理
  • 常见的“锁”有哪些?
  • (200): error: #29: expected an expression error: #40: expected an identifier
  • 一周学会Flask3 Python Web开发-Jinja2模板基本使用
  • 福禄抽-测试报告
  • ASP.NET MVC 下载文件
  • Android移动应用开发实践-1-下载安装和简单使用Android Studio 3.5.2版本(频频出错)
  • Oracle中补全时间的处理
  • 计算机毕业设计SpringBoot+Vue.js教师工作量管理系统(源码+LW文档+PPT+讲解)
  • 本地部署AI模型 --- DeepSeek(二)---更新中
  • Keepalive基础
  • 具备智能广告拦截、个性化定制的便捷网页浏览器
  • Deepin(Linux)安装MySQL指南
  • 计算机三级网络技术知识汇总【6】
  • 【数据结构】快指针和慢指针
  • Mybatis学习总结
  • @Configuration与 @Component的差异
  • 条款23:宁以non-member、non-friend替换member函数
  • [嵌入式] 嵌入式软件开发书籍推荐及电子版分享
  • 物流网站开发系统论文/如何注册网站怎么注册
  • 免费制作论坛网站模板免费下载/公司网络搭建
  • 做一个网站需要多少钱 怎么做/百度收录查询方法
  • 网站建设服务好公司/站长工具seo客户端
  • 东软 网站群平台建设/推广普通话活动方案
  • 有什么免费企业网站是做企业黄页的/百度seo搜索