0

i'm adding local cache to my server by using google's guava utils.

guava is very suitable for my scenario, except it can only store "non-null" values into its local cache (both com.google.common.cache.Cache and com.google.common.cache.LoadingCache did).

well, this is not good. because my server may fail to get values from remote database, because of time run out or other reasons. if i give a default value to guava, it will be stored in local cache, and will always be there, unless some eviction conditions were met. but the question is i cannot give a reasonable default value to guava.

can somebody tell me, why guava has this constraint, and how can i bypass it? can ehcache be more suited for my case?

4

4 回答 4

9

Guava 对 null 并不友好。我邀请您阅读他们关于 null [1] 的宣言。

如果您必须绕过该行为,请使用Optional<V>[2]。因此,不要使用LoadingCache<K, V>and CacheLoader<K, V>,而是使用LoadingCache<K, Optional<V>>and CacheLoader<Optional<V>>

通过这种方式,您可以继续使用Cache并增加灵活性Optional

  1. http://code.google.com/p/guava-libraries/wiki/UsingAndAvoidingNullExplained
  2. http://docs.guava-libraries.googlecode.com/git-history/release/javadoc/com/google/common/base/Optional.html
于 2013-08-27T11:40:11.317 回答
1

您可以使用空对象设计模式 http://en.wikipedia.org/wiki/Null_Object_pattern

于 2013-08-27T11:39:50.757 回答
1

null如果您只是超时尝试从远程数据库获取值,您真的要缓存(或任何表示“不存在”的东西)吗?您可以改为抛出异常,这将表明获取值失败(与不存在的值相反)并且也不向缓存添加任何内容,以便当您再次尝试获取键的值时它将尝试再次从数据库中读取。

于 2013-08-27T16:53:08.387 回答
0

在ehcache中,你可以区分空值和不存在的键,但是你需要一个额外的Element类。

// ehcache
cache.put(new Element("key1", null));
assertNull(cache.get("key1").getObjectValue());  // null value
assertNull(cache.get("key2"));  // key is not exist

在番石榴中,您不必使用额外的类,但无法区分空值和不存在的键。

// plain guava
cache.put("key1", "value1");
assertNull(cache.getIfPresent("key2"));  // key is not exist

正如其他人所说,您可以使用空对象模式或Optional使用番石榴。有了这样一个额外的类,你可以处理null像 ehcache 这样的值。

// guava with Optional
cache.put("key1", Optional.absent());
assertFalse(cache.getIfPresent("key1").isPresent());  // null value
assertNull(cache.getIfPresent("key2"));  // key is not exist
于 2013-08-27T12:14:02.897 回答