概述
Caffeine是使用Java8对Guava缓存的重写版本,在Spring Boot 2.0中将取代,基于LRU算法实现,支持多种缓存过期策略。
1、依赖
<dependency>
<groupId>com.github.ben-manes.caffeine</groupId>
<artifactId>caffeine</artifactId>
<version>2.5.5</version>
</dependency>
2、本地测试
三种缓存策略都可以通过:
put(k,v); 方法覆盖式的写入缓存,
getIfPresent(k);读取缓存,不存在返回null
import com.github.benmanes.caffeine.cache.AsyncLoadingCache;
import com.github.benmanes.caffeine.cache.Cache;
import com.github.benmanes.caffeine.cache.Caffeine;
import com.github.benmanes.caffeine.cache.LoadingCache;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.TimeUnit;
public class CaffeineCache {
private static String key = "test";
private static Object result = null;
public static void main(String[] args) throws Exception{
/**
* 手动加载:
* 在获取的时候如果key存在,则获取,不存在就手动写入
*/
Cache<String, Object> manualCache = Caffeine.newBuilder()
.initialCapacity(1000)
.maximumSize(5000)
.expireAfterWrite(30, TimeUnit.SECONDS)
.build();
result = manualCache.get(key, k -> "manualCache");
System.out.println("手动加载:"+result);
/**
* 同步加载:
* 用同步方式去获取一个缓存和上面的手动方式是一个原理
* 查询并在缺失的情况下使用同步的方式来构建
*/
LoadingCache<String, Object> loadingCache = Caffeine.newBuilder()
.maximumSize(1000)
.expireAfterWrite(30, TimeUnit.SECONDS)
.build(key -> "loadingCache");
result = loadingCache.get(key);
System.out.println("同步加载:"+ result);
/**
* 异步加载:
* 查询并在缺失的情况下使用异步的方式来构建缓存.
* 使用 isDone()查看异步是否完成。
*/
AsyncLoadingCache<String, Object> asyncLoadingCache = Caffeine.newBuilder()
.maximumSize(1000)
.expireAfterWrite(30, TimeUnit.SECONDS)
.buildAsync(key -> "asyncLoadingCache");
CompletableFuture<Object> graph = asyncLoadingCache.get(key);
if(graph.isDone()){
System.out.println("异步加载:"+ graph.get().toString());
}
}
}
注意事项:以下是Caffine的get方法的注解
大意就是:get方法是阻塞的,多线程环境中只有一个线程可以执行传入的方法,其他的线程则进入等待。且在阻塞中,不能对缓存中的其他键进行修改。所以在多线程环境中尽量使用简单的,耗时短的方法获取值,或者减少不必要的写操作,不要造成线程集体阻塞。
最后
以上就是执着曲奇为你收集整理的Caffeine缓存之王的全部内容,希望文章能够帮你解决Caffeine缓存之王所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复