理解本地缓存Caffeine

填充策略

1. 手动填充

初始化:

Cache 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 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 cache = Caffeine.newBuilder()
  .maximumSize(100)
  .expireAfterWrite(1, TimeUnit.MINUTES)
  .buildAsync(k -> getValue(key));

用法与同步加载大体相同,但在调用get或getAll方法时返回Future结果。

缓存回收

缓存回收是异步执行的,在获取缓存大小之前,调用cleanUp方法,有助于等待回收的完成。

  1. 基于大小回收
  2. 基于时间的回收
    • 访问后过期
    • 写入后过期
    • 自定义策略
  3. 自定义策略

统计

// 初始化调用recordStats() 
LoadingCache cache = Caffeine.newBuilder()
  .maximumSize(100)
  .recordStats()
  .build(k -> getValue());

// 调用stats()方法获取统计信息
cache.stats();

你可能感兴趣的:(理解本地缓存Caffeine)