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

Caffeine介绍

Caffeine‌ 是一个高性能的 Java ‌本地缓存库‌,专为现代应用程序设计,由知名开发者 Ben Manes 开发。它是 Guava Cache 的进化版本,在性能和功能上都有显著提升,特别适合高并发场景。


核心作用:

  1. 内存缓存管理
    将频繁访问的数据存储在内存中,避免重复计算或频繁访问外部资源(如数据库、API)

  2. 加速数据访问
    相比磁盘/网络 I/O,内存访问速度提升 100-100,000 倍

  3. 降低系统负载
    减少对后端资源(数据库、服务)的访问压力


关键特性:

特性说明性能影响
Window TinyLFU 算法智能淘汰策略(比LRU更高效)命中率提升 40%+
无锁并发设计基于 ConcurrentHashMap 优化读写性能提升 8 倍 vs Guava
异步刷新机制后台自动更新过期数据避免访问延迟
权重控制按对象大小而非数量限制缓存内存利用率优化
统计监控实时命中率/加载时间统计便于调优

典型使用场景:

javaCopy Code

// 1. 基础缓存示例 Cache<String, User> cache = Caffeine.newBuilder() .maximumSize(10_000) // 最大条目数 .expireAfterWrite(5, TimeUnit.MINUTES) // 写入5分钟后过期 .build(); // 使用缓存 User user = cache.get(userId, id -> userDao.getUser(id)); // 2. 自动刷新(防止缓存击穿) LoadingCache<String, Data> loadingCache = Caffeine.newBuilder() .refreshAfterWrite(1, TimeUnit.MINUTES) // 1分钟后异步刷新 .build(key -> fetchFromDatabase(key));


高性能原理:

  1. 并发优化

    plaintextCopy Code

    读操作:完全无锁 (基于 ConcurrentHashMap) 写操作:最小化锁竞争 (分段锁技术)

  2. 内存效率

    plaintextCopy Code

    对象存储优化 - 比 Guava 减少 30% 内存占用 避免 GC 压力 - 使用软/弱引用策略可控

  3. 智能淘汰

    plaintextCopy Code

    TinyLFU 算法流程图: 新访问数据 → 进入 Admission Window → 频率统计 → ├─ 高频数据 → 保留 └─ 低频数据 → 对比历史频率 → 淘汰最低频


与同类对比:

特性CaffeineGuava CacheEhcache
并发吞吐量⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐
内存效率⭐⭐⭐⭐⭐⭐⭐⭐⭐
命中率⭐⭐⭐⭐⭐⭐⭐⭐⭐
集群支持
监控功能⚠️ 有限

SpringBoot 集成:

yamlCopy Code

# application.yml spring: cache: type: caffeine caffeine: spec: maximumSize=50000,expireAfterWrite=300s

javaCopy Code

@Configuration public class CacheConfig { @Bean public CacheManager cacheManager() { CaffeineCacheManager manager = new CaffeineCacheManager(); manager.setCaffeine(Caffeine.newBuilder() .initialCapacity(1000) .maximumSize(50_000) .expireAfterAccess(10, TimeUnit.MINUTES) .recordStats()); // 开启统计 return manager; } } // 使用缓存 @Service public class UserService { @Cacheable(value = "users", key = "#id") public User getUser(String id) { // DB查询操作 } }


百万 QPS 场景最佳实践:

  1. 多级缓存架构
    Caffeine(本地) → Redis(分布式) → DB(持久层)

  2. 缓存预热策略

    javaCopy Code

    // 启动时加载热点数据 @PostConstruct public void preloadCache() { hotKeys.parallelStream().forEach(key -> cache.get(key, this::loadFromDB) ); }

  3. 防穿透方案

    javaCopy Code

    .build(key -> { Data data = dbLoader.load(key); return data != null ? data : new EmptyObject(); // 空值缓存 });

  4. 监控统计

    javaCopy Code

    CacheStats stats = cache.stats(); log.info("命中率: {}%", stats.hitRate() * 100); log.info("平均加载时间: {}ms", stats.averageLoadPenalty() / 1_000_000);


性能数据参考:

QPS服务器配置平均响应GC 影响
50万4核8G< 2msYoung GC < 5ms/分钟
100万8核16G< 5msFull GC ≈ 0
500万16核32G集群< 10ms可控 STW

实测数据:单机 Caffeine 可支撑 200万+ OPS(8核 CPU)

Caffeine 是现代 Java 高并发系统的首选本地缓存解决方案,尤其适合作为缓存体系的「第一道防线」,配合分布式缓存实现百万级 QPS 场景。

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

相关文章:

  • windows docker(二) 启动存在的容器
  • 【芯片良率:半导体制造的生死线,如何避免陷阱并提升竞争力?】
  • OpenCV计算机视觉实战(23)——目标检测详解
  • 在Docker中安装MySQL时3306端口占用问题
  • 广度优先搜索(BFS, Breadth-First Search)
  • 书写腾讯天气遇到的问题
  • LeetCode 777.在LR字符串中交换相邻字符
  • PyTorch 面试题及详细答案120题(106-115)-- 理论与拓展
  • LeetCode 刷题【61. 旋转链表】
  • SAP-MM 配置工厂的名称时候,容易疏忽的点
  • Linux操作系统(6)
  • 《驾驭云原生复杂性:隐性Bug的全链路防御体系构建》
  • 线程安全问题及解决方案
  • STM32 - Embedded IDE - GCC - 如何在工程中生成.bin格式固件
  • 从API到AI Agent:落地模型上下文协议(MCP)的设计模式与核心步骤
  • 【提示词】...(后续单元)在Prompt 的作用
  • [Dify 专栏] 如何通过 Prompt 在 Dify 中模拟 Persona:即便没有专属配置,也能让 AI 扮演角色
  • 【51单片机】【protues仿真】基于51单片机呼叫系统
  • 【Qt】QToolBar、QToolButton的常用用法
  • VR智慧楼宇技术:打造智能办公空间的卓越方案​
  • 【Linux笔记】命令行与vim基础
  • qt使用笔记三之 QGraphicsView、QGraphicsScene 和 QGraphicsPixmapItem 详解
  • 深度学习——基于卷积神经网络实现食物图像分类(数据增强)
  • 教资科三【信息技术】— 教学知识(18~21题): 课程理论知识 教学评价 教学实施 教学设计
  • think
  • Ansible角色:高效开发与管理的秘密
  • Day11--HOT100--25. K 个一组翻转链表,138. 随机链表的复制,148. 排序链表
  • 开源SOTA:阶跃发布端到端语音大模型Step-Audio 2 mini!
  • Cloudflare安全规则实用指南:从路径拦截到IP限制的10个经典范例
  • 使用coil加载图片更新不及时