利用guava创建MapCache

本文深入探讨了Guava缓存的实现机制,包括并发控制、缓存过期策略、缓存容量限制及LRU算法的应用。通过示例代码解析了缓存加载器的使用,以及如何设置缓存的并发级别、初始容量、最大容量和记录统计信息。同时介绍了缓存移除监听器的配置方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

LoadingCache<String, Object> DETECTION_RULE_CACHE = CacheBuilder.newBuilder()
            //设置并发级别为8,并发级别是指可以同时写缓存的线程数
            .concurrencyLevel(8)
            //设置写缓存后8秒钟过期
            //.expireAfterWrite(8, TimeUnit.SECONDS)
            //设置缓存容器的初始容量为10
            .initialCapacity(10)
            //设置缓存最大容量为100,超过100之后就会按照LRU最近虽少使用算法来移除缓存项
            .maximumSize(1000)
            //设置要统计缓存的命中率
            .recordStats()
            //设置缓存的移除通知
            .removalListener(removalNotification -> LogUtil.info(MapCache.class, removalNotification.getKey() + " was removed, cause is " + removalNotification.getCause()))
            .build(new CacheLoader<String, Object>() {
                @Override
                public Object load(@Nullable @NotNull String key) {
                    return null;
                }
            });

 

### Guava Cache 与本地 Map 的区别 #### 基本概念对比 Guava Cache 和 `HashMap` 或其他形式的本地 `Map` 都是用来存储键值对的数据结构,但是两者的设计目标不同。Guava Cache 主要是为了提供更高级别的缓存功能而设计,具有自动清理机制和支持多种回收策略等功能[^2]。 #### 功能特性差异 - **线程安全性** - Guava Cache 默认是线程安全的,并且提供了比 `ConcurrentHashMap` 更丰富的元素失效策略。 - 而普通的 `HashMap` 不具备内置的并发控制能力,在多线程环境下需要额外同步措施才能保证线程安全[^4]。 - Guava Cache 支持基于时间、引用强度以及最大容量等多种维度上的对象回收逻辑,这使得它非常适合用来做临时数据缓冲区。 - 可配置为使用弱引用(`weakKeys`, `weakValues`)或软引用来管理缓存项的生命期,从而让不再活跃的对象更容易被垃圾收集器处理掉。 - 还可以根据设定的最大条目数来限制缓存规模,超出限额时会触发淘汰算法清除旧记录。 - 标准 Java 中的地图类则不具备这样的动态调整能力和自动化维护手段[^5]。 - **统计信息支持** - Guava Cache 内置了详细的性能监控工具,可以方便地追踪命中率等指标以便优化应用表现。 - 传统 Maps 并无此类辅助设施可供利用。 #### 性能考量 对于大多数应用场景而言,由于其内部实现了高效的哈希表查找加上合理的锁分段技术,即使是在高负载情况下也能保持较好的响应速度;而且得益于灵活可定制化的驱逐规则,可以在一定程度上缓解内存压力并减少不必要的磁盘 I/O 操作次数。相比之下,除非特别针对某些极端条件做了特殊优化,否则常规 HashMap 在这方面可能稍显逊色一些[^1]。 #### 使用场景推荐 - 当业务需求涉及到频繁读取相对稳定的小型数据集,并希望获得更好的资源利用率及时效性保障时,选用 Guava Cache 将是一个明智的选择。 - 如果只是简单地保存少量静态映射关系而不涉及复杂的生命周期管理,则可以直接采用标准库里的 map 类型即可满足要求[^3]。 ```java // 创建一个带有LRU(Least Recently Used)置换政策且最多容纳10万条目的guava cache实例 Cache<String, String> myCache = CacheBuilder.newBuilder() .maximumSize(100_000) .expireAfterWrite(10, TimeUnit.MINUTES)// 设置写入后过期时间为十分钟 .build(); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

41摄氏度男

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值