LoadingCache<Integer, String> loadingCache = Caffeine.newBuilder() .expireAfterWrite(1, TimeUnit.SECONDS) .refreshAfterWrite(500, TimeUnit.MILLISECONDS) .maximumSize(10) // 缓存最大数量 .removalListener((RemovalListener<Integer, String>) (integer, s, removalCause) -> { System.out.println("key:" + integer + " value:" + s + " cause:"+removalCause); }) .build(new CacheLoader<Integer, String>() { @Nullable @Override public String load(@NonNull Integer i) throws Exception { return i.toString(); } @Override public Map<Integer, String> loadAll(Iterable<? extends Integer> keys) { Map<Integer, String> map = new HashMap<>(); for (Integer i : keys) { map.put(i, i.toString()); } return map; } }); 复制代码
LoadingCache<Integer, String> weightLoadingCache = Caffeine.newBuilder() .maximumWeight(1000) .weigher((Weigher<Integer, String>) (integer, s) -> integer) .build(new CacheLoader<Integer, String>() { @Nullable @Override public String load(@NonNull Integer integer) throws Exception { return null; } }); 复制代码
caffeine是不缓存null值的,如果在load的时候返回null,caffeine将会把对应的key从缓存中删除,同时,loadAll返回的map里是不可以包含value为null的数据,否则将会报NullPointerException
返回给定的key在LoadingCache中的数据,如果cache中没有该key,将调用CacheLoader的load方法去load数据,如果load不到数据,将返回null。
返回keys中的key的缓存数据,组合成map,如果某个key或某些key在缓存中不存在,将会调用loadAll去load数据,loadAll仍然无法load到数据的key,将不会put到返回的map里。