com.google.common.cache.CacheLoader$InvalidCacheLoadException: CacheLoader returned null for key word. at com.google.common.cache.LocalCache$Segment.getAndRecordStats(LocalCache.java:2287) ... 从异常描述能看出,不允许返回null,这一块之前倒是没怎么注意,因此对于null的情况,要么定义一个标记表示不存在,...
public Cache<String, User> createUserCache() { return CacheBuilder.newBuilder().maximumSize(10000L).build(); } 限制缓存权重weight public Cache<String, String> createUserCache() { return CacheBuilder.newBuilder() .maximumWeight(50000) .weigher((key, value) -> (int) Math.ceil(value.length() ...
cache不能返回null的value: get时,key不存在返回null,返回null。 get时,key存在,缓存的value不为null,返回非null值。 可以通过get的value==null,来判断加载时机(即:通过value为null作为是否加载缓存的标准。反之,如果缓存的是null,那么即使加载过一次,但是每次get时,同样会再加载一次,这样就没有起到缓存的作用)。
@TestpublicvoidwhenNullValue_thenOptional(){CacheLoader<String,Optional<String>>loader;loader=newCacheLoader<String,Optional<String>>(){@Overridepublic Optional<String>load(String key){returnOptional.fromNullable(getSuffix(key));}};LoadingCache<String,Optional<String>>cache;cache=CacheBuilder.newBuilder(...
Guava在实际的Java后端项目中应用的场景还是比较多的,比如限流,缓存,容器操作之类的,有挺多实用的工具类,这里记录一下,在使用GuavaCache,返回null的一个问题 I. 常见使用姿势 @Testpublic void testGuava() {LoadingCache<String, String> cache = CacheBuilder.newBuilder().build(new CacheLoader<String, String>...
put放入key3---监听到缓存移除事件:key1=value1put操作后,当前缓存记录数:2查询key1对应值:null 从输出结果可以看到,即使数据并没有过期,但在插入第3条记录的时候,缓存容器还是自动将最初写入的key1记录给移除了,挪出了空间用于新的数据的插入。这个就是因为触发了Guava Cache的被动淘汰机制,以确保缓存容器中的...
String value = cache.get(1); System.out.println(Thread.currentThread().getName() + " " + simpleDateFormat.format(new Date()) + " " + value); TimeUnit.SECONDS.sleep(3); } } catch (Exception ignored) { } }).start(); new Thread(() -> { ...
当容器内的缓存数量接近(注意是接近、而非达到)设定的最大阈值的时候,会触发guava cache的数据清理机制,会基于LRU或FIFO删除一些不常用的key-value键值对。这种方式需要在创建容器的时候指定其maximumSize或者maximumWeight,然后才会基于size或者weight进行判断并执行上述的清理操作。
实际上Guava整体设计思想就是拒绝null的,很多地方都会执行com.google.common.base.Preconditions.checkNotNull的检查。 默认情况guava cache将会抛出异常,如果试图加载null value–因为cache null 是没有任何意义的。 但是如果null value 对你的代码而已有一些特殊的含义,你可以尝试用Optional来表达,像下面这个例子: ...
Cache Cache是Guava提供的最基本缓存接口,创建一个Cache很简单 @TestpublicvoidcacheCreateTest(){Cache<String,String>cache=CacheBuilder.newBuilder().maximumSize(100)//设置缓存最大容量.expireAfterWrite(1,TimeUnit.MINUTES)//过期策略,写入一分钟后过期.build();cache.put("a","a1");Stringvalue=cache.getIf...