谷歌Guava缓存实战:使用LoadingCache

需积分: 0 8 下载量 46 浏览量 更新于2024-07-20 收藏 524KB PDF 举报
"JavaCachingwithGuava.pdf是Google官方文档,主要介绍如何使用Guava库中的缓存功能。Guava项目是Google开源的核心Java库,包含集合、并发库、字符串处理等基础组件,是其他项目的构建基础。文档中特别提到了`com.google.common.cache`包,它提供了内存缓存的实现,线程安全且内部结构类似`ConcurrentHashMap`,但不支持分布式缓存。Guava提供两种类型的缓存:LoadingCache和Cache,这里主要关注能自动加载条目的LoadingCache。" 在Java开发中,缓存是一种提高性能的关键技术,Guava Cache提供了便捷的内存缓存解决方案。下面将详细讨论Guava Cache的主要特性、使用方式以及它如何帮助优化应用程序的性能。 1. **Guava Cache的类型** - **LoadingCache**: 当缓存中不存在指定的键值对时,它会自动通过`CacheLoader`加载数据。`get`方法在找不到对应key的值时,会调用`load`方法进行加载,确保每次获取的都是最新数据。 - **Cache**: 这种缓存不自动加载条目,需要开发者手动管理加载过程。在某些场景下,如果控制加载时机或缓存策略有特殊需求,可以使用这种类型。 2. **创建和配置LoadingCache** 创建一个LoadingCache通常需要提供一个`CacheLoader`实例,它定义了如何从原始数据源加载数据。例如,可以创建一个将key转换为大写字符串的缓存: ```java CacheLoader<String, String> loader = new CacheLoader<String, String>() { public String load(String key) { return key.toUpperCase(); } }; LoadingCache<String, String> cache = CacheBuilder.newBuilder() .maximumSize(1000) // 设置最大容量 .expireAfterWrite(1, TimeUnit.MINUTES) // 设置条目过期时间 .build(loader); ``` 3. **缓存操作** - `put`: 手动添加键值对到缓存。 - `get`: 获取缓存中的值,如果不存在,则使用`CacheLoader`加载。 - `refresh`: 强制刷新指定的key,重新加载其对应的值。 - `cleanUp`: 清理过期的或已移除的条目。 - `size`: 返回缓存中当前的条目数量。 4. **缓存配置** - `maximumSize`: 设置缓存的最大容量,超出后会根据淘汰策略移除旧条目。 - `expireAfterWrite`/`expireAfterAccess`: 设置条目过期策略,可按写入或访问后的时间来设定。 - `weakKeys`/`weakValues`: 使用弱引用存储键或值,当对象不再被引用时,可以被垃圾回收。 - `softValues`: 使用软引用存储值,内存紧张时会被回收。 - `recordStats`: 记录缓存的统计信息,如命中率、请求次数等。 5. **缓存的性能和内存管理** Guava Cache的设计目标是高效和线程安全。它的内部实现类似于`ConcurrentHashMap`,确保并发访问下的高效率。通过合理的配置,可以有效地利用内存,减少不必要的数据加载,从而提高整体应用性能。 6. **缓存的监听器** 可以注册`CacheListener`来监听缓存事件,如插入、删除和更新,以便进行额外的数据处理或日志记录。 Guava Cache提供了一种强大且灵活的内存缓存解决方案,通过自动化加载和丰富的配置选项,帮助开发者在Java应用中实现高效的数据缓存。