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

本地缓存方案Guava Cache

Guava Cache 是 Google 的 Guava 库提供的一个高效内存缓存解决方案,适用于需要快速访问且不频繁变更的数据。

// 普通缓存
Cache<Key, Value> cache = CacheBuilder.newBuilder()
    .maximumSize(1000) // 最大条目数
    .expireAfterWrite(10, TimeUnit.MINUTES) // 写入后10分钟过期
    .recordStats() // 开启统计
    .build();

// 自动加载缓存(LoadingCache)
LoadingCache<Key, Value> loadingCache = CacheBuilder.newBuilder()
    .maximumWeight(10_000)
    .weigher((Key k, Value v) -> v.size()) // 按值大小计算权重
    .build(new CacheLoader<Key, Value>() {
        @Override
        public Value load(Key key) throws Exception {
            return loadDataFromDataSource(key); // 缺失时自动加载
        }
    });

2. 核心操作

// 手动放入缓存
cache.put(key, value);

// 获取缓存(缺失时返回null)
Value value = cache.getIfPresent(key);

// 获取并自动加载(LoadingCache)
Value value = loadingCache.get(key); // 若缺失,调用CacheLoader.load()

// 手动移除
cache.invalidate(key);
cache.invalidateAll(); // 清空所有缓存

3. 过期策略

  • 时间驱动​:
    • expireAfterWrite(duration):写入后指定时间过期。
    • expireAfterAccess(duration):最后一次访问后指定时间过期。
  • 容量驱动​:
    • maximumSize(long):基于LRU策略淘汰条目。
    • maximumWeight(long) + weigher:按条目权重计算总容量。

4. 自动加载(LoadingCache)​

  • 同步加载​:通过 CacheLoader.load() 方法在缓存未命中时同步加载数据。
  • 批量加载​:重写 loadAll(Iterable<? extends K> keys) 提升多键加载效率。
  • 异步刷新​:使用 refreshAfterWrite(duration) 在后台异步刷新过期条目,避免阻塞读取。

5. 移除监听器(RemovalListener)​

监听缓存条目被移除的事件,执行资源释放等操作:

RemovalListener<Key, Value> listener = notification -> {
    if (notification.wasEvicted()) {
        // 处理资源释放
    }
};

Cache<Key, Value> cache = CacheBuilder.newBuilder()
    .removalListener(listener)
    .build();

6. 统计信息

通过 recordStats() 启用统计,获取命中率、加载时间等数据:

Cache<?, ?> cache = CacheBuilder.newBuilder().recordStats().build();
// ...
CacheStats stats = cache.stats();
double hitRate = stats.hitRate(); // 命中率
long missCount = stats.missCount(); // 未命中次数

7. 线程安全

Guava Cache 默认线程安全,支持高并发读写,无需额外同步。


8. 异常处理

  • CacheLoader 中抛出的异常会被封装为 UncheckedExecutionException
  • 建议在 load 方法中捕获异常,或通过 getUnchecked() 处理。

9. 使用场景

  • 高频读取,低频变更​:如配置信息、用户会话。
  • 计算密集型数据​:避免重复计算(如复杂查询结果)。
  • 资源敏感场景​:通过权重控制内存占用。

示例代码

LoadingCache<String, String> cache = CacheBuilder.newBuilder()
    .maximumSize(1000)
    .expireAfterAccess(5, TimeUnit.MINUTES)
    .recordStats()
    .build(new CacheLoader<String, String>() {
        @Override
        public String load(String key) {
            return fetchDataFromDB(key); // 缺失时从数据库加载
        }
    });

// 使用缓存
try {
    String data = cache.get("user:123");
} catch (ExecutionException e) {
    // 处理加载异常
}

// 手动刷新
cache.refresh("user:123");

通过合理配置策略,Guava Cache 能有效平衡内存使用与性能,是 Java 应用中轻量级缓存的优选方案。

相关文章:

  • 《MySQL是怎样运行的》总结笔记
  • vue入门:template 和 JSX
  • jupyter4.4安装使用
  • 器件封装-2025.4.13
  • 【李宏毅深度学习——回归模型的PyTorch架构】Homework 1:COVID-19 Cases Prediction (Regression)
  • 【深拷贝、浅拷贝】golang函数参数传递,变量复制后,操作变量参数,是否影响原有数据?全面解析
  • 软件设计的核心:从模块化到内聚与耦合
  • dify部署,ollama部署,拉取模型,创建ai聊天应用
  • 神经特征的统计度量及AI拓展
  • uniapp转换markdown
  • MySQL 常见存储引擎全解析:InnoDB、MyISAM、Memory 等对比与实战
  • 随笔 20250413 Elasticsearch 的 term 查询
  • 【UE5 C++课程系列笔记】35——HTTP基础——HTTP客户端异步请求API接口并解析响应的JSON
  • 【redis进阶三】分布式系统之主从复制结构(1)
  • deepseek微调环境配置
  • 如何对大模型进行优化,以提高其性能和效率?
  • 【计网】网络交换技术之分组交换(复习自用,重要1)
  • go语言学习笔记:gin + gorm + mysql 用户增删改查案例入门
  • 【Spring Boot 过滤器】
  • 中断的硬件框架
  • 习近平同巴西总统卢拉共同出席合作文件签字仪式
  • 甩掉“肥胖刺客”,科学减重指南来了
  • 俄总统新闻秘书:普京提议谈判表明俄寻求和平解决方案意愿
  • 中国工程院院士、国医大师石学敏逝世
  • 印方称所有敌对行动均得到反击和回应,不会升级冲突
  • 呼和浩特推进新一轮国企重组整合:杜绝一项目一公司、一业务一公司