缓存器
0.Caffeine库和Guava的cache比较
Caffeine Cache
- 基本介绍:
- Caffeine 是一个高性能的本地缓存库,是 Guava Cache 的增强版,提供了更高的性能和更丰富的功能。
- 它基于 Java 8 的
ConcurrentHashMap
,利用了ConcurrentHashMap
的高并发特性,同时使用了一些高级技术,如W-TinyLFU
驱逐策略,提供了出色的缓存命中率。 - 数据一致性:
- 读写操作的一致性:Caffeine 提供了强一致性保证,读写操作都是原子的,因为它使用
ConcurrentHashMap
作为存储结构,内部使用了一些并发控制机制,确保在多线程环境下的数据一致性。 - 驱逐和更新的一致性:当缓存元素被驱逐或更新时,Caffeine 提供了多种驱逐策略,如基于大小、时间和引用,确保在并发环境下的数据一致性。例如,当使用
maximumSize
或expireAfterWrite
等配置时,缓存会自动移除元素,这些操作是线程安全的。 - 性能效率:
- 读取性能:Caffeine 利用了
ConcurrentHashMap
的高性能读取特性,通过优化算法和数据结构,提供了非常低的读取延迟,在高并发读取场景下表现出色。 - 写入性能:对于写入操作,Caffeine 也提供了很好的性能,尤其是在大量数据写入时,它可以处理高并发的写入操作,因为它的内部实现使用了一些优化的并发控制机制,避免了锁竞争。
- 更新性能:更新操作(如修改缓存元素的值)也是高效的,因为它利用了
ConcurrentHashMap
的原子更新操作,减少了锁的使用,提高了性能。
对比总结
- 数据一致性:
- 相似性:Caffeine 和 Guava Cache 都使用
ConcurrentHashMap
作为存储结构,在读写操作上都能提供较好的数据一致性保证,确保多线程环境下的安全操作。 - 区别:Caffeine 可能在一些复杂的并发场景下提供更精细的一致性保证,因为它的实现更侧重于性能优化和并发控制,尤其是在高并发更新和驱逐操作时,Caffeine 更具优势。
- 性能效率:
- 读取性能:Caffeine 通常具有更高的读取性能,尤其是在高并发读取场景下,因为它的优化算法和数据结构可以降低延迟。
- 写入性能:Caffeine 在高并发写入场景下性能更好,因为它使用了更先进的并发控制机制,减少了锁的使用,避免了 Guava Cache 可能出现的性能瓶颈。
- 更新性能:Caffeine 在更新操作上更高效,它使用更精细的并发控制,避免了过多的锁竞争,提高了更新操作的性能。
注意事项
- 功能选择:
- Guava Cache 可能更适合一些简单的缓存场景,它提供了基本的缓存功能,易于使用和集成。
- Caffeine 更适合高性能和高并发的场景,尤其是对缓存性能有较高要求的场景。
- 迁移成本:
- 从 Guava Cache 迁移到 Caffeine 相对容易,因为它们的 API 相似,但需要注意一些细微的差异和新功能的使用。
结论
- 如果你需要高性能和高并发的缓存解决方案,Caffeine 通常是更好的选择,它在数据一致性和性能方面都有出色的表现,尤其是在高并发的读取、写入和更新操作中。
- 如果你已经在使用 Guava 库,并且缓存需求相对简单,Guava Cache 可能足够满足你的需求,它提供了基本的缓存功能和较好的数据一致性。
总的来说,Caffeine 在性能和并发控制方面更具优势,能更好地保证数据一致性和提供更高的效率,但 Guava Cache 对于简单的缓存需求也是一个不错的选择,并且在许多现有的项目中已经得到广泛使用。根据具体的应用场景和性能要求,你可以选择更适合你的缓存库
1.CacheLoader抽象类
2.CacheBuilder类
当然可以!CacheBuilder
是 Guava 库中用于构建缓存实例的强大工具。它提供了多种方法来配置缓存的行为,包括过期策略、最大大小、移除监听器等。下面是对 CacheBuilder
中一些常用方法的详细解析,并结合你提供的代码片段进行说明。
(1) 常用的 Guava库的CacheBuilder
方法
newBuilder()
- 作用: 创建一个新的
CacheBuilder
实例。 - 返回值:
CacheBuilder<Object, Object>
,表示一个新创建的CacheBuilder
对象。 - 示例:
CacheBuilder builder = CacheBuilder.newBuilder();
expireAfterWrite(long duration, TimeUnit unit)
- 作用: 设置缓存项在写入后经过指定时间后自动失效。
- 参数:
duration
: 时间长度。unit
: 时间单位(如TimeUnit.MINUTES
)。- 返回值:
CacheBuilder<K, V>
,表示配置了过期策略的CacheBuilder
对象。 - 示例:
CacheBuilder builder = CacheBuilder.newBuilder()
.expireAfterWrite(10, TimeUnit.MINUTES);
maximumSize(long size)
- 作用: 设置缓存的最大条目数。
- 参数:
size
: 最大条目数。- 返回值:
CacheBuilder<K, V>
,表示配置了最大大小的CacheBuilder
对象。 - 示例:
CacheBuilder builder = CacheBuilder.newBuilder()
.maximumSize(1000);
removalListener(RemovalListener<? super K, ? super V> listener)
- 作用: 设置当缓存项被移除时触发的监听器。
- 参数:
listener
: 一个RemovalListener
对象,它会在缓存项被移除时调用。- 返回值:
CacheBuilder<K, V>
,表示配置了移除监听器的CacheBuilder
对象。 - 示例:
RemovalListener removalListener = (notification) -> {
System.out.println("Removed: " + notification.getKey() + ", Cause: " + notification.getCause());
};
CacheBuilder builder = CacheBuilder.newBuilder()
.removalListener(removalListener);
softValues()
- 作用: 使用软引用存储缓存值,允许垃圾回收器在内存不足时回收这些值。
- 返回值:
CacheBuilder<K, V>
,表示配置了软引用值的CacheBuilder
对象。 - 示例:
CacheBuilder builder = CacheBuilder.newBuilder()
.softValues();
weakKeys()
- 作用: 使用弱引用存储缓存键,允许垃圾回收器在没有强引用指向键时回收这些键及其对应的值。
- 返回值:
CacheBuilder<K, V>
,表示配置了弱引用键的CacheBuilder
对象。 - 示例:
CacheBuilder builder = CacheBuilder.newBuilder()
.weakKeys();
recordStats()
- 作用: 启用统计功能,收集关于缓存命中率、负载因子等的信息。
- 返回值:
CacheBuilder<K, V>
,表示启用了统计功能的CacheBuilder
对象。 - 示例:
CacheBuilder builder = CacheBuilder.newBuilder()
.recordStats();
build(CacheLoader<K, V> loader)
- 作用: 构建一个带有指定
CacheLoader
的LoadingCache
实例。 - 参数:
loader
: 一个CacheLoader
对象,用于加载缓存项。- 返回值:
LoadingCache<K, V>
,表示带有CacheLoader
的LoadingCache
实例。 - 示例:
CacheLoader loader = new CacheLoader() {
@Override
public String load(String key) throws Exception {
return "Value for " + key;
}
};
LoadingCache cache = CacheBuilder.newBuilder()
.expireAfterWrite(10, TimeUnit.MINUTES)
.build(loader);
build(Map<K, V> initialData)
- 作用: 构建一个初始数据为指定映射的
Cache
实例。 - 参数:
initialData
: 初始数据映射。- 返回值:
Cache<K, V>
,表示初始数据为指定映射的Cache
实例。 - 示例:
Map initialData = Maps.newHashMap();
initialData.put("key1", "value1");
initialData.put("key2", "value2");
Cache cache = CacheBuilder.newBuilder()
.expireAfterWrite(10, TimeUnit.MINUTES)
.build(initialData);
(2) 常用的 Caffeine库的CacheBuilder
方法
- maximumSize(long maximumSize)
-
功能: 设置缓存的最大条目数。
-
参数: 最大条目数。
-
示例:
Cache cache = Caffeine.newBuilder()
.maximumSize(1000)
.build();
- maximumWeight(long maximumWeight)
-
功能: 设置缓存的最大权重值。
-
参数: 最大权重值。
-
注意: 需要提供
Weigher
来计算每个条目的权重。 -
示例:
Cache cache = Caffeine.newBuilder()
.maximumWeight(10000)
.weigher((key, value) -> value.length())
.build();
- expireAfterAccess(Duration duration)
-
功能: 设置缓存项在最后一次访问后过期的时间。
-
参数: 过期时间。
-
示例:
Cache cache = Caffeine.newBuilder()
.expireAfterAccess(Duration.ofMinutes(10))
.build();
- expireAfterWrite(Duration duration)
-
功能: 设置缓存项在写入后过期的时间。
-
参数: 过期时间。
-
示例:
Cache cache = Caffeine.newBuilder()
.expireAfterWrite(Duration.ofHours(1))
.build();
- refreshAfterWrite(Duration duration)
-
功能: 设置缓存项在写入后多长时间自动刷新。
-
参数: 自动刷新时间。
-
注意: 需要提供
AsyncCacheLoader
或CacheLoader
。 -
示例:
Cache cache = Caffeine.newBuilder()
.refreshAfterWrite(Duration.ofMinutes(5))
.build(key -> loadDataFromDatabase(key));
- removalListener(RemovalListener<K, V> listener)
-
功能: 设置移除监听器,在缓存项被移除时触发。
-
参数: 移除监听器。
-
示例:
Cache cache = Caffeine.newBuilder()
.removalListener((key, value, cause) -> {
System.out.println("Key " + key + " was removed (" + cause + ")");
})
.build();
- recordStats()
-
功能: 启用统计信息收集。
-
注意: 启用后可以通过
cache.stats()
获取统计数据。 -
示例:
Cache cache = Caffeine.newBuilder()
.recordStats()
.build();
// 获取统计信息
CacheStats stats = cache.stats();
System.out.println("Hit rate: " + stats.hitRate());
- executor(Executor executor)
-
功能: 设置用于执行异步操作的线程池。
-
参数: 线程池。
-
示例:
ExecutorService executor = Executors.newFixedThreadPool(4);
Cache cache = Caffeine.newBuilder()
.executor(executor)
.build();
- weakKeys()
-
功能: 使用弱引用存储键。
-
注意: 键被垃圾回收时,对应的缓存项也会被移除。
-
示例:
Cache cache = Caffeine.newBuilder()
.weakKeys()
.build();
- weakValues()
-
功能: 使用弱引用存储值。
-
注意: 值被垃圾回收时,对应的缓存项也会被移除。
-
示例:
Cache cache = Caffeine.newBuilder()
.weakValues()
.build();
- softValues()
-
功能: 使用软引用存储值。
-
注意: 值只有在内存不足时才会被垃圾回收。
-
示例:
Cache cache = Caffeine.newBuilder()
.softValues()
.build();
- ticker(Ticker ticker)
-
功能: 设置计时器,用于跟踪时间和过期策略。
-
参数: 计时器。
-
示例:
Ticker ticker = Ticker.systemTicker();
Cache cache = Caffeine.newBuilder()
.ticker(ticker)
.expireAfterWrite(Duration.ofHours(1))
.build();
- buildAsync(AsyncCacheLoader asyncLoader)
-
功能: 创建异步加载器
-
参数: loader异步加载器
-
示例
AsyncCacheLoader<String, Map<String, String>> asyncCacheLoader = new CacheLoadBuilder.Builder()
.setHost(host)
.setPort(Integer.valueOf(port))
.setNamespace(joinDim.getNamespace())
.setTableName(joinDim.getTableName())
.setBinNames(joinDim.getDimFields())
.setType(type)
.setKeyType(joinDim.getKeyType())
.buildAsync();
asyncCache = Caffeine.newBuilder()
.expireAfterWrite(2, TimeUnit.MILLISECONDS)
.buildAsync(asyncCacheLoader);
```