填充策略
1. 手动填充
初始化:
Cache<String, DataObject> cache = Caffeine.newBuilder()
.expireAfterWrite(1, TimeUnit.MINUTES)
.maximumSize(100)
.build();
手动填充: key和value都不能为null,否则NullPointerException
cache.put(key, value); //线程安全,考虑多个线程put同一个key的情况
获取数据有两种方法:
getIfPresent(key); // 缓存中存在相应数据,则返回;不存在返回null
/**
* if cached, return; otherwise create, cache and return
* 当多个线程调用该方法请求同一个key时,若key不在缓存中,
* 则只有一个线程会执行对应的getValue方法,其他线程会被阻塞。
* 即getValue方法不宜是一个执行时间长的操作。
*/
get(key, key -> getValue(key));
2. 同步加载
初始化:
LoadingCache<String, DataObject> cache = Caffeine.newBuilder()
.maximumSize(100)
.expireAfterWrite(1, TimeUnit.MINUTES)
.build(k -> getValue(key));
调用cache.get(key)方法,若缓存中不存在,则会调用build中的方法,执行方法获取到值不为null则存入缓存。
一个key最多只调用一次。
build可传入一个CacheLoader的实现类,实现load方法和loadAll方法,分别对应一个key和多个key。
cache.getAll(keys);
如果请求的一组key和请求的另一组key有相同的key的话,可以选择实现同时去加载相同key对应的数据,
或者一个请求去等另一个请求去加载该key。
3. 异步加载
初始化:
LoadingCache<String, DataObject> cache = Caffeine.newBuilder()
.maximumSize(100)
.expireAfterWrite(1, TimeUnit.MINUTES)
.buildAsync(k -> getValue(key));
用法与同步加载大体相同,但在调用get或getAll方法时返回Future结果。
缓存回收
缓存回收是异步执行的,在获取缓存大小之前,调用cleanUp方法,有助于等待回收的完成。
- 基于大小回收
- 基于时间的回收
- 访问后过期
- 写入后过期
- 自定义策略
- 自定义策略
统计
// 初始化调用recordStats()
LoadingCache<String, DataObject> cache = Caffeine.newBuilder()
.maximumSize(100)
.recordStats()
.build(k -> getValue());
// 调用stats()方法获取统计信息
cache.stats();
网友评论