在调用CacheBuilder的build方法时,必须传递一个CacheLoader类型的参数,CacheLoader的load方法需要我们提供实现。当调用LoadingCache的get方法时,如果缓存不存在对应key的记录,则CacheLoader中的load方法会被自动调用从外存加载数据,load方法的返回值会作为key对应的value存储到LoadingCache中,并从get方法返回。 当然如果你不想指...
cache不能返回null的value: get时,key不存在返回null,返回null。 get时,key存在,缓存的value不为null,返回非null值。 可以通过get的value==null,来判断加载时机(即:通过value为null作为是否加载缓存的标准。反之,如果缓存的是null,那么即使加载过一次,但是每次get时,同样会再加载一次,这样就没有起到缓存的作用)。
为了解决这个问题,Guava Cache中提供了一种相对精准的控制策略,即基于权重的总量控制,根据一定的规则,计算出每条value记录所占的权重值,然后以权重值进行总量的计算。 还是上面的例子,我们按照权重进行设定,假定1k对应基础权重1,则100k可转换为权重100。这样一来: 限制缓存最大占用500M,1k对应权重1,Nk代表权重N,则...
Object value = cache.getIfPresent("k1"); // 获取缓存,当缓存不存在时,则通Callable进行加载并返回。该操作是原子 Object getValue = cache.get("k1", new Callable<Object>() { @Override public Object call() throws Exception { return null; } }); 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. ...
String cacheValue = cache.getIfPresent("name"); log.info("name缓存对应的值为:{}", cacheValue); String cacheAge = cache.getIfPresent("age"); log.info("第一次查询age缓存对应的值为:{}", cacheAge); if (cacheAge == null) {
CacheLoader.asyncReloading(new CacheLoader<String, String>() { @Override public String load(String key) { return key; } @Override public ListenableFuture<String> reload(String key, String oldValue) throws Exception { return super.reload(key, oldValue); ...
return null; } }); String word = cache.getUnchecked("hello"); System.out.println(word); System.out.println(cache.getUnchecked("word")); } 上面是一个非常简单的测试case,需要注意的是,cache.get("word") 的执行,并不如逾期的返回的是null,而是会抛一个异常出来 ...
Guava在实际的Java后端项目中应用的场景还是比较多的,比如限流,缓存,容器操作之类的,有挺多实用的工具类,这里记录一下,在使用GuavaCache,返回null的一个问题 I. 常见使用姿势 @Testpublic void testGuava() {LoadingCache<String, String> cache = CacheBuilder.newBuilder().build(new CacheLoader<String, String>...
5.软值soft value 通过使用softValues()方法,我们可以让垃圾收集器去收集我们的缓存值: 软值 6.处理null值 现在,我们来看一下如何处理null值。如果你试图加载一个null值得话,Guava Cache会抛出一个异常---因为缓存一个null值是毫无意义的。 但是,如果null值在你的代码中确实有用处的话,你可以好好地使用一下Op...
实际上Guava整体设计思想就是拒绝null的,很多地方都会执行com.google.common.base.Preconditions.checkNotNull的检查。 默认情况guava cache将会抛出异常,如果试图加载null value–因为cache null 是没有任何意义的。 但是如果null value 对你的代码而已有一些特殊的含义,你可以尝试用Optional来表达,像下面这个例子: ...