文章目录
平常开发中我们经常会使用到缓存,比如对于一些不常更新的数据却需要经常的访问或者计算,为这些热点数据加缓存可以有效减少服务器的性能损失和资源浪费。
本地缓存相比Redis缓存以及其他存储避免了网络IO的开销,它不需要发送redis命令,直接在本地jvm进程中操作缓存数据,而且基于内存的读写效率很高,所以在需要的时候合理使用本地缓存可以有效提高系统的吞吐量。CaffeineCache是非常优秀的开源本地缓存框架。本篇不分析其原理,只关注其简单用法。
<dependency>
<groupId>com.github.ben-manes.caffeine</groupId>
<artifactId>caffeine</artifactId>
<version>2.6.2</version>
</dependency>
一、常用API
CaffeineCache 有非常简易的API,可以通过如下方式快速构建一个本地缓存。
LoadingCache<String, Object> cache = Caffeine.newBuilder()
.expireAfterWrite(1, TimeUnit.SECONDS)
.expireAfterAccess(1, TimeUnit.SECONDS)
.maximumSize(10)
.build(new CacheLoader<String, Object>() {
@Override
public Object load(String s) {
return s + "loadValue";
}
});
缓存的常用API如下:
public interface Cache<K, V> {
//取值,如果不存在则返回null
@Nullable
V getIfPresent(@Nonnull Object key);
//取值,如果不存在则执行函数并将执行结果缓存
@Nullable
V get(@Nonnull K key, @Nonnull Function<? super K, ? extends V> var2);
//存值
void put(@Nonnull K key, @Nonnull V value);
//批量存值,接受一个map类型的参数,将map中的元素缓存起来
void putAll(@Nonnull Map<? extends K, ? extends V> map);
//移除缓存项
void invalidate(@Nonnull Object key);
//接受一个可迭代的参数进行批量移除
void invalidateAll(@Nonnull Iterable<?> var1);
//清空缓存
void invalidateAll();
//获取当前缓存项的数量(map中的条目数)
@Nonnegative
long estimatedSize();
//缓存的map视图
@Nonnull
ConcurrentMap<K, V> asMap();
//……
}
public interface LoadingCache<K, V> extends Cache<K, V> {
@Nullable
V get(@Nonnull K key);
@Nonnull
Map<K, V> getAll(@Nonnull Iterable<? extends K> var1)