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) | 设置缓存加载器,用于当缓存中不存在条目时加载新的条目。 |
其他方法
-
缓存加载:
get(K key, Function<? super K, ? extends V> mappingFunction)
:尝试获取缓存中与指定键相关联的值,如果键不存在,则通过提供的映射函数加载值。get(K key, Callable<? extends V> loader)
:尝试获取缓存中与指定键相关联的值,如果键不存在,则通过提供的加载器加载值。
-
缓存删除:
invalidate(Object key)
:使缓存中的指定键及其对应的值失效。invalidateAll()
:使缓存中的所有键值对失效。invalidateAll(Iterable<?> keys)
:使缓存中指定键集合对应的键值对失效。
-
缓存统计:
stats()
:获取缓存的统计信息,包括命中率、加载次数、加载失败次数等。
-
缓存监听:
removalListener(RemovalListener<? super K, ? super V> listener)
:为缓存设置移除监听器,用于监听缓存中条目被移除的事件。
-
缓存配置:
maximumSize(long maximumSize)
:设置缓存的最大容量。expireAfterWrite(long duration, TimeUnit unit)
:设置写入后的过期时间。expireAfterAccess(long duration, TimeUnit unit)
:设置访问后的过期时间。refreshAfterWrite(long duration, TimeUnit unit)
:设置写入后的刷新时间。recordStats()
:开启缓存的统计功能,使得可以获取缓存的统计信息。
-
异步加载和刷新:
getAsync(K key, Function<? super K, ? extends CompletableFuture<V>> mappingFunction)
:异步加载与指定键相关联的值。getIfPresentAsync(K key, Function<? super K, ? extends CompletableFuture<V>> mappingFunction)
:异步获取缓存中与指定键相关联的值,如果键不存在,则通过提供的映射函数异步加载值。refresh(K key)
:异步刷新与指定键相关联的值。
其他一些知识
-
数据加载策略:
- 同步加载: 默认情况下,Caffeine 使用同步加载策略。这意味着当缓存中不存在某个键对应的值时,当前线程会被阻塞,直到加载完成并将值放入缓存。这种策略适用于数据加载操作相对轻量且加载时间较短的情况。
- 异步加载: 对于数据加载耗时较长的情况,可以使用异步加载策略。通过使用
get(K key, Function<? super K, ? extends CompletableFuture<V>> mappingFunction)
方法,可以异步加载数据,以允许当前线程继续执行其他操作。 - 刷新: 使用
refresh(K key)
方法可以定期刷新缓存中的数据,以确保缓存中的数据保持最新。刷新操作可以在后台线程中异步执行,不会影响到当前线程。
-
缓存回收策略:
- 基于大小: 通过设置缓存的最大容量来控制缓存的大小。当缓存大小超过设定的最大容量时,Caffeine 将根据一定的策略自动回收部分缓存条目,以释放空间。
- 基于权重: 类似于基于大小,但是可以为不同的缓存条目设置不同的权重,以更精细地控制缓存的大小。
- 基于时间: 可以设置缓存条目的过期时间,当缓存条目过期时,Caffeine 将自动将其从缓存中移除。
-
并发控制:
- Caffeine 使用并发数据结构来实现缓存,从而保证在多线程并发访问下的线程安全性。这意味着可以同时从多个线程访问和操作缓存,而不会出现数据不一致或竞态条件等问题。
-
缓存预热:
- 缓存预热指的是在应用启动时预先加载缓存数据,以避免在应用运行期间的第一次访问中出现较长的加载延迟。可以通过在应用启动时手动加载数据或者使用 Caffeine 的
preloading
功能来实现缓存预热。
- 缓存预热指的是在应用启动时预先加载缓存数据,以避免在应用运行期间的第一次访问中出现较长的加载延迟。可以通过在应用启动时手动加载数据或者使用 Caffeine 的
-
监控和调优:
- Caffeine 提供了丰富的缓存统计信息,可以通过调用
stats()
方法获取。利用这些统计信息,可以对缓存的性能进行监控和调优,包括缓存命中率、加载次数、加载失败次数等。
- Caffeine 提供了丰富的缓存统计信息,可以通过调用
-
高级配置和定制化:
- Caffeine 提供了许多高级配置选项和定制化功能,如自定义缓存加载器、自定义缓存策略、自定义缓存监听器等。通过灵活地配置这些选项,可以满足更复杂的应用需求。
-
与Spring集成:
- 如果你使用 Spring 框架,可以将 Caffeine 缓存集成到 Spring 应用中,以实现基于注解的缓存、缓存管理和自动配置等功能。Spring 提供了
@Cacheable
、@CacheEvict
等注解来简化缓存的使用和管理。
- 如果你使用 Spring 框架,可以将 Caffeine 缓存集成到 Spring 应用中,以实现基于注解的缓存、缓存管理和自动配置等功能。Spring 提供了
评论区