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

6.1、Redis多级缓存原理和优化、Redis部分参数优化调整

多级缓存架构原理与优化

多级缓存核心架构
命中
未命中
命中
未命中
命中
未命中
客户端请求
Nginx本地缓存
直接响应
应用内存缓存
返回数据并刷新Nginx缓存
Redis分布式缓存
返回数据并刷新应用缓存
数据库查询
  1. Nginx本地缓存(最小)

    • 定位:最前端缓存层
    • 特点
      • 存储热点静态资源(图片/CSS/JS)
      • 使用proxy_cache模块实现动态内容缓存
      • 过期时间短(秒级),快速失效
    • 优势:响应速度最快(微秒级)
  2. 应用内存缓存(稍大)

    • 定位:应用级二级缓存
    • 实现
      • Caffeine/Guava/Ehcache
      • Spring Cache注解驱动
    • 策略
      • 最大条目限制(如10,000条)
      • LRU淘汰策略
      • 异步刷新机制
    • 场景:高频访问的动态数据(如商品详情)
  3. Redis分布式缓存(最大)

    • 定位:共享三级缓存
    • 特性
      • 集群化部署(Redis Cluster)
      • 数据持久化(RDB+AOF)
      • 横向扩容能力
    • 数据:全量业务数据最终屏障

Redis连接池深度优化

核心参数配置矩阵
参数作用描述计算公式配置建议
maxTotal最大连接数QPS预期/(1000/平均耗时ms)理论值×1.2(预留缓冲)
maxIdle最大空闲连接数= maxTotal避免连接池伸缩抖动
minIdle最小空闲连接数= maxTotal×0.3防止突发流量新建连接延迟
testOnBorrow借出连接校验-true(确保连接可用性)
参数优化实践
  1. maxTotal动态计算

    // 参数定义
    int expectedQPS = 50000;    // 业务预期QPS
    float avgCommandTime = 1.0f; // 命令平均耗时(ms)// 计算公式
    int theoreticalValue = (int) Math.ceil(expectedQPS / (1000 / avgCommandTime));
    int maxTotal = (int) (theoreticalValue * 1.2);  // 增加20%缓冲
    
  2. 连接池最佳配置

    JedisPoolConfig config = new JedisPoolConfig();
    config.setMaxTotal(120);       // 理论值100,增加缓冲
    config.setMaxIdle(120);        // 等于maxTotal消除扩容开销
    config.setMinIdle(40);         // 保底33%空闲连接
    config.setTestOnBorrow(true);  // 借出时健康检查
    
  3. 阻塞场景应对策略

    • 问题:大命令阻塞导致连接池耗尽
    • 解决方案
      // 添加熔断机制
      CircuitBreaker breaker = new CircuitBreaker().withFailureThreshold(5, 1) // 5秒内5次失败触发.withWaitDuration(30);      // 熔断30秒
      

多级缓存调优策略

  1. Nginx层优化

    proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=my_cache:10m max_size=1g inactive=60s use_temp_path=off;server {location / {proxy_cache my_cache;proxy_cache_valid 200 5s;  # 动态内容缓存5秒add_header X-Cache-Status $upstream_cache_status;}
    }
    
  2. 内存缓存选择

    缓存框架适用场景QPS支持
    Caffeine高并发读场景200万+
    Ehcache堆外内存管理50万+
    Guava简单轻量级缓存30万+
  3. Redis集群规划

    • 数据分片:CRC16算法分16384槽
    • 扩容公式节点数 = 预期容量 / 单节点建议容量(20GB)
    • 连接池配置maxTotal = (业务线程数 × 节点数) × 1.2

关键问题避坑指南

  1. 连接泄露检测

    # 监控Redis连接使用
    redis-cli info clients
    # Clients
    connected_clients:145
    client_longest_output_list:0
    client_biggest_input_buf:0
    
  2. 缓存穿透防御组合拳

    // 三级防护机制
    public Product getProduct(Long id) {// 1. 布隆过滤器拦截if (!bloomFilter.mightContain(id)) return null; // 2. 内存缓存查询Product p = localCache.get(id); // 3. Redis查询(含空值缓存)if (p == null) p = redis.getWithNullCache(id); 
    }
    
  3. 热点Key监控

    # Redis热点Key检测
    redis-cli --hotkeys
    # 输出样例
    [47.62%] hot key: 'product:1001' with 142356 requests
    

通过分级缓存架构和精细化的连接池配置,可构建支持10万+QPS的高并发系统。核心要点:缓存分层衰减连接池静态化热点动态探测,三者结合实现性能与资源的平衡。

http://www.dtcms.com/a/312318.html

相关文章:

  • 在 macOS 上通过 Docker 部署DM8 (ARM 架构)
  • 译|用户增长策略如何使用因果机器学习的案例
  • Javaweb————Apache Tomcat目录文件结构讲解
  • java学习 73矩阵置零 54螺旋矩阵 148排序链表
  • pydantic - 更方便地编写 entity 类
  • [LeetCode优选算法专题一双指针——有效三角形的个数]
  • Vue+SpringBoot+langchain4j实战案例:实现AI消息问答 及 Markdown打字机渲染效果
  • CVE-2025-5947 漏洞场景剖析
  • ⭐CVPR2025 FreeUV:无真值 3D 人脸纹理重建框架
  • winntsetup安装驱动和光驱安装F6功能一样----NT5.2.3790源代码分析
  • 嵌入式硬件篇---Openmv
  • 若没有安全可靠性保障,对于工程应用而言,AI或许就是大玩具吗?
  • 13.Redis 的级联复制
  • 计算机网络:如何在实际网络中进行子网划分
  • nestjs @Get 从入门到精通
  • 选择排序原理与C语言实现详解
  • Python 小数据池(Small Object Pool)详解
  • golang的包和闭包
  • 【Linux】linux基础开发工具(三) 版本控制器Git、调试器 - gdb/cgdb使用、一些实用的调试技巧
  • Libevent(5)之使用教程(4)工具
  • 二叉树的锯齿形层次遍历
  • 日语学习-日语知识点小记-进阶-JLPT-真题训练-N1阶段(2):018年7月-JLPT-N1
  • TI 毫米波雷达开发:(四)毫米波雷达板开发所需软件
  • 记一次v-if和key错误使用,导致vue2的内存爆炸修复!
  • 著作权登记遇难题:创作者如何突破确权困境?
  • 【论文阅读|V2M: VISUAL 2-DIMENSIONAL MAMBA FOR IMAGE REPRESENTATION LEARNING】
  • 字节-面试
  • 性能测试工具ApacheBench、Jmeter
  • gitee使用教程
  • 昇思学习营-开发版-模型推理和性能优化