缓存器

0 阅读7分钟

缓存器

0.Caffeine库和Guava的cache比较

Caffeine Cache

  • 基本介绍
  • Caffeine 是一个高性能的本地缓存库,是 Guava Cache 的增强版,提供了更高的性能和更丰富的功能。
  • 它基于 Java 8 的 ConcurrentHashMap,利用了 ConcurrentHashMap 的高并发特性,同时使用了一些高级技术,如 W-TinyLFU 驱逐策略,提供了出色的缓存命中率。
  • 数据一致性
  • 读写操作的一致性:Caffeine 提供了强一致性保证,读写操作都是原子的,因为它使用 ConcurrentHashMap 作为存储结构,内部使用了一些并发控制机制,确保在多线程环境下的数据一致性。
  • 驱逐和更新的一致性:当缓存元素被驱逐或更新时,Caffeine 提供了多种驱逐策略,如基于大小、时间和引用,确保在并发环境下的数据一致性。例如,当使用 maximumSizeexpireAfterWrite 等配置时,缓存会自动移除元素,这些操作是线程安全的。
  • 性能效率
  • 读取性能: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 方法

  1. newBuilder()
  • 作用: 创建一个新的 CacheBuilder 实例。
  • 返回值: CacheBuilder<Object, Object>,表示一个新创建的 CacheBuilder 对象。
  • 示例:
CacheBuilder builder = CacheBuilder.newBuilder();
  1. expireAfterWrite(long duration, TimeUnit unit)
  • 作用: 设置缓存项在写入后经过指定时间后自动失效。
  • 参数:
  • duration: 时间长度。
  • unit: 时间单位(如 TimeUnit.MINUTES)。
  • 返回值: CacheBuilder<K, V>,表示配置了过期策略的 CacheBuilder 对象。
  • 示例:
CacheBuilder builder = CacheBuilder.newBuilder()
    .expireAfterWrite(10, TimeUnit.MINUTES);
  1. maximumSize(long size)
  • 作用: 设置缓存的最大条目数。
  • 参数:
  • size: 最大条目数。
  • 返回值: CacheBuilder<K, V>,表示配置了最大大小的 CacheBuilder 对象。
  • 示例:
CacheBuilder builder = CacheBuilder.newBuilder()
    .maximumSize(1000);
  1. 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);
  1. softValues()
  • 作用: 使用软引用存储缓存值,允许垃圾回收器在内存不足时回收这些值。
  • 返回值: CacheBuilder<K, V>,表示配置了软引用值的 CacheBuilder 对象。
  • 示例:
CacheBuilder builder = CacheBuilder.newBuilder()
    .softValues();
  1. weakKeys()
  • 作用: 使用弱引用存储缓存键,允许垃圾回收器在没有强引用指向键时回收这些键及其对应的值。
  • 返回值: CacheBuilder<K, V>,表示配置了弱引用键的 CacheBuilder 对象。
  • 示例:
CacheBuilder builder = CacheBuilder.newBuilder()
    .weakKeys();
  1. recordStats()
  • 作用: 启用统计功能,收集关于缓存命中率、负载因子等的信息。
  • 返回值: CacheBuilder<K, V>,表示启用了统计功能的 CacheBuilder 对象。
  • 示例:
CacheBuilder builder = CacheBuilder.newBuilder()
    .recordStats();
  1. build(CacheLoader<K, V> loader)
  • 作用: 构建一个带有指定 CacheLoaderLoadingCache 实例。
  • 参数:
  • loader: 一个 CacheLoader 对象,用于加载缓存项。
  • 返回值: LoadingCache<K, V>,表示带有 CacheLoaderLoadingCache 实例。
  • 示例:
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);
  1. 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 方法

  1. maximumSize(long maximumSize)
  • 功能: 设置缓存的最大条目数。

  • 参数: 最大条目数。

  • 示例:

Cache cache = Caffeine.newBuilder() 
    .maximumSize(1000) 
    .build();
  1. maximumWeight(long maximumWeight)
  • 功能: 设置缓存的最大权重值。

  • 参数: 最大权重值。

  • 注意: 需要提供 Weigher 来计算每个条目的权重。

  • 示例:

Cache cache = Caffeine.newBuilder()
    .maximumWeight(10000)
    .weigher((key, value) -> value.length())
    .build();
  1. expireAfterAccess(Duration duration)
  • 功能: 设置缓存项在最后一次访问后过期的时间。

  • 参数: 过期时间。

  • 示例:

Cache cache = Caffeine.newBuilder() 
    .expireAfterAccess(Duration.ofMinutes(10)) 
    .build();
  1. expireAfterWrite(Duration duration)
  • 功能: 设置缓存项在写入后过期的时间。

  • 参数: 过期时间。

  • 示例:

Cache cache = Caffeine.newBuilder()
    .expireAfterWrite(Duration.ofHours(1))
    .build();
  1. refreshAfterWrite(Duration duration)
  • 功能: 设置缓存项在写入后多长时间自动刷新。

  • 参数: 自动刷新时间。

  • 注意: 需要提供 AsyncCacheLoaderCacheLoader

  • 示例:

Cache cache = Caffeine.newBuilder() 
    .refreshAfterWrite(Duration.ofMinutes(5))
    .build(key -> loadDataFromDatabase(key));
  1. removalListener(RemovalListener<K, V> listener)
  • 功能: 设置移除监听器,在缓存项被移除时触发。

  • 参数: 移除监听器。

  • 示例:

Cache cache = Caffeine.newBuilder()
    .removalListener((key, value, cause) -> {
        System.out.println("Key " + key + " was removed (" + cause + ")");
    })
    .build();
  1. recordStats()
  • 功能: 启用统计信息收集。

  • 注意: 启用后可以通过 cache.stats() 获取统计数据。

  • 示例:

Cache cache = Caffeine.newBuilder() 
    .recordStats() 
    .build();
// 获取统计信息 
CacheStats stats = cache.stats(); 
System.out.println("Hit rate: " + stats.hitRate());
  1. executor(Executor executor)
  • 功能: 设置用于执行异步操作的线程池。

  • 参数: 线程池。

  • 示例:

ExecutorService executor = Executors.newFixedThreadPool(4);
Cache cache = Caffeine.newBuilder()
    .executor(executor)
    .build();
  1. weakKeys()
  • 功能: 使用弱引用存储键。

  • 注意: 键被垃圾回收时,对应的缓存项也会被移除。

  • 示例:

Cache cache = Caffeine.newBuilder() 
    .weakKeys() 
    .build();
  1. weakValues()
  • 功能: 使用弱引用存储值。

  • 注意: 值被垃圾回收时,对应的缓存项也会被移除。

  • 示例:

Cache cache = Caffeine.newBuilder()
    .weakValues()
    .build();
  1. softValues()
  • 功能: 使用软引用存储值。

  • 注意: 值只有在内存不足时才会被垃圾回收。

  • 示例:

Cache cache = Caffeine.newBuilder() 
    .softValues() 
    .build();
  1. ticker(Ticker ticker)
  • 功能: 设置计时器,用于跟踪时间和过期策略。

  • 参数: 计时器。

  • 示例:

Ticker ticker = Ticker.systemTicker();
Cache cache = Caffeine.newBuilder()
    .ticker(ticker)
    .expireAfterWrite(Duration.ofHours(1))
    .build();
  1. 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);
    ```