diff --git a/spring/caffeine/caffeine.md b/spring/caffeine/caffeine.md index 09f002c..aa2da22 100644 --- a/spring/caffeine/caffeine.md +++ b/spring/caffeine/caffeine.md @@ -1,3 +1,25 @@ +- [caffeine](#caffeine) + - [Cache](#cache) + - [注入](#注入) + - [手动](#手动) + - [Loading](#loading) + - [异步(手动)](#异步手动) + - [Async Loading](#async-loading) + - [淘汰](#淘汰) + - [基于时间的](#基于时间的) + - [基于时间的淘汰策略](#基于时间的淘汰策略) + - [基于引用的淘汰策略](#基于引用的淘汰策略) + - [移除](#移除) + - [removal listener](#removal-listener) + - [compute](#compute) + - [统计](#统计) + - [cleanup](#cleanup) + - [软引用和弱引用](#软引用和弱引用) + - [weakKeys](#weakkeys) + - [weakValues](#weakvalues) + - [softValues](#softvalues) + + # caffeine caffeine是一个高性能的java缓存库,其几乎能够提供最佳的命中率。 cache类似于ConcurrentMap,但并不完全相同。在ConcurrentMap中,会维护所有添加到其中的元素,直到元素被显式移除;而Cache则是可以通过配置来自动的淘汰元素,从而限制cache的内存占用。   @@ -199,5 +221,14 @@ LoadingCache graphs = Caffeine.newBuilder() .expireAfterWrite(10, TimeUnit.MINUTES) .build(key -> createExpensiveGraph(key)); ``` -scheduler可以用于及时的清理过期缓存, +scheduler可以用于及时的清理过期缓存 +### 软引用和弱引用 +caffeine支持基于引用来设置淘汰策略。caffeine支持针对key和value使用弱引用,针对value使用软引用。 +#### weakKeys +`caffeine.weakKeys()`存储使用弱引用的key,如果没有强引用指向key,那么key将会被垃圾回收。垃圾回收时只会比较对象地址,故而整个缓存在比较key时会通过`==`而不是`equals`来进行比较 +#### weakValues +`caffeine.weakValues()`存储使用弱引用的value,如果没有强引用指向value,value会被垃圾回收。同样地,在整个cache中,会使用`==`而不是`equals`来对value进行比较 +#### softValues +软引用的value通常会在垃圾回收时按照lru的方式进行回收,根据内存情况决定是否进行回收。由于使用软引用会带来性能问题,通常更推荐使用基于max-size的回收策略。 +同样地,基于软引用的value在整个缓存中会通过`==`而不是`equals()`来进行垃圾回收。