侧边栏壁纸
博主头像
极客手札博主等级

Do everything!

  • 累计撰写 31 篇文章
  • 累计创建 16 个标签
  • 累计收到 1 条评论

目 录CONTENT

文章目录

caffeine学习

caffeine学习

导入依赖

<dependency>
    <groupId>com.github.ben-manes.caffeine</groupId>
    <artifactId>caffeine</artifactId>
    <!--https://mvnrepository.com/artifact/com.github.ben-manes.caffeine/caffeinez找最新版-->
    <version>3.0.5</version>
</dependency>

创建缓存对象

// 创建一个 Caffeine 缓存对象,设置缓存大小和过期时间
private static Cache<String, String> Cache = Caffeine.newBuilder()
        .maximumSize(100) // 设置最大缓存条目数
        .expireAfterWrite(10, TimeUnit.MINUTES) // 设置写入后过期时间
        .build();

设置选项

方法描述
expireAfterAccess(duration, unit)设置缓存条目在指定时间段内没有被访问后过期。
refreshAfterWrite(duration, unit)设置缓存条目在被创建或者最后一次访问后一定时间内进行刷新。
weakKeys()将缓存键作为弱引用存储,如果键没有其他引用,则可以被垃圾回收。
weakValues()将缓存值作为弱引用存储,如果值没有其他引用,则可以被垃圾回收。
softValues()将缓存值作为软引用存储,如果系统内存不足时,则可以被垃圾回收。
recordStats()启用缓存统计信息的收集,如命中率、加载成功率等。
executor(Executor)设置异步加载缓存值的 Executor。
executor(Runnable)设置缓存操作的全局执行器。
scheduler(Scheduler)设置调度器,用于定期清理过期条目。
removalListener(RemovalListener)设置缓存条目移除时的监听器,可以在条目被移除时执行一些额外操作。
writer(CacheWriter)设置缓存写入器,用于在条目被写入缓存时执行一些额外的操作。
loader(Loader)设置缓存加载器,用于当缓存中不存在条目时加载新的条目。

其他方法

  1. 缓存加载:

    • get(K key, Function<? super K, ? extends V> mappingFunction):尝试获取缓存中与指定键相关联的值,如果键不存在,则通过提供的映射函数加载值。
    • get(K key, Callable<? extends V> loader):尝试获取缓存中与指定键相关联的值,如果键不存在,则通过提供的加载器加载值。
  2. 缓存删除:

    • invalidate(Object key):使缓存中的指定键及其对应的值失效。
    • invalidateAll():使缓存中的所有键值对失效。
    • invalidateAll(Iterable<?> keys):使缓存中指定键集合对应的键值对失效。
  3. 缓存统计:

    • stats():获取缓存的统计信息,包括命中率、加载次数、加载失败次数等。
  4. 缓存监听:

    • removalListener(RemovalListener<? super K, ? super V> listener):为缓存设置移除监听器,用于监听缓存中条目被移除的事件。
  5. 缓存配置:

    • maximumSize(long maximumSize):设置缓存的最大容量。
    • expireAfterWrite(long duration, TimeUnit unit):设置写入后的过期时间。
    • expireAfterAccess(long duration, TimeUnit unit):设置访问后的过期时间。
    • refreshAfterWrite(long duration, TimeUnit unit):设置写入后的刷新时间。
    • recordStats():开启缓存的统计功能,使得可以获取缓存的统计信息。
  6. 异步加载和刷新:

    • getAsync(K key, Function<? super K, ? extends CompletableFuture<V>> mappingFunction):异步加载与指定键相关联的值。
    • getIfPresentAsync(K key, Function<? super K, ? extends CompletableFuture<V>> mappingFunction):异步获取缓存中与指定键相关联的值,如果键不存在,则通过提供的映射函数异步加载值。
    • refresh(K key):异步刷新与指定键相关联的值。

其他一些知识

  1. 数据加载策略:

    • 同步加载: 默认情况下,Caffeine 使用同步加载策略。这意味着当缓存中不存在某个键对应的值时,当前线程会被阻塞,直到加载完成并将值放入缓存。这种策略适用于数据加载操作相对轻量且加载时间较短的情况。
    • 异步加载: 对于数据加载耗时较长的情况,可以使用异步加载策略。通过使用 get(K key, Function<? super K, ? extends CompletableFuture<V>> mappingFunction) 方法,可以异步加载数据,以允许当前线程继续执行其他操作。
    • 刷新: 使用 refresh(K key) 方法可以定期刷新缓存中的数据,以确保缓存中的数据保持最新。刷新操作可以在后台线程中异步执行,不会影响到当前线程。
  2. 缓存回收策略:

    • 基于大小: 通过设置缓存的最大容量来控制缓存的大小。当缓存大小超过设定的最大容量时,Caffeine 将根据一定的策略自动回收部分缓存条目,以释放空间。
    • 基于权重: 类似于基于大小,但是可以为不同的缓存条目设置不同的权重,以更精细地控制缓存的大小。
    • 基于时间: 可以设置缓存条目的过期时间,当缓存条目过期时,Caffeine 将自动将其从缓存中移除。
  3. 并发控制:

    • Caffeine 使用并发数据结构来实现缓存,从而保证在多线程并发访问下的线程安全性。这意味着可以同时从多个线程访问和操作缓存,而不会出现数据不一致或竞态条件等问题。
  4. 缓存预热:

    • 缓存预热指的是在应用启动时预先加载缓存数据,以避免在应用运行期间的第一次访问中出现较长的加载延迟。可以通过在应用启动时手动加载数据或者使用 Caffeine 的 preloading 功能来实现缓存预热。
  5. 监控和调优:

    • Caffeine 提供了丰富的缓存统计信息,可以通过调用 stats() 方法获取。利用这些统计信息,可以对缓存的性能进行监控和调优,包括缓存命中率、加载次数、加载失败次数等。
  6. 高级配置和定制化:

    • Caffeine 提供了许多高级配置选项和定制化功能,如自定义缓存加载器、自定义缓存策略、自定义缓存监听器等。通过灵活地配置这些选项,可以满足更复杂的应用需求。
  7. 与Spring集成:

    • 如果你使用 Spring 框架,可以将 Caffeine 缓存集成到 Spring 应用中,以实现基于注解的缓存、缓存管理和自动配置等功能。Spring 提供了 @Cacheable@CacheEvict 等注解来简化缓存的使用和管理。
0

评论区