2013-04-30 83 views
3

我与我的首席架构师有关于缓存空值的争论。他的观点是,根据定义,空值不会被缓存。缓存空值

现在我的问题是,总是有一个缓存未命中,并且总是输入一段代码而没有任何需要,因为在我的情况下,空值是完全正确的。

我的问题:这个案件有官方定义吗?

+6

在什么情况下“不高速缓存”?你没有给我们提供足够的信息给你任何答案。 – 2013-04-30 07:44:54

+0

我们得到了一些代码,它缓存了一些键值对。底层是Ehcache(默认情况下,Ehcache将键值对与空值进行缓存,但我们不这样做)。现在我处于这种情况,即如果空值存储在缓存中,可以避免大量的db访问。 – user871611 2013-04-30 07:57:30

+0

缓存实现通常可能非常通用。这意味着您可以在应用程序的任何地方重复使用它如果您的通用缓存设计为将'null'作为**未缓存的**。然后,如果只有一个或两个缓存将'null'作为缓存值,那么改变这种行为是不值得的。然而,如果你真的想要缓存空值,你需要另一个缓存实现(可以扩展原缓存)来缓存'null'。 – Drogba 2013-04-30 08:01:16

回答

3

我怀疑这个案件有官方文件,因为答案在很大程度上取决于您的使用情况。例如,假设您有一个需要处理200毫秒的Web查询,该查询返回null,并且这是一个有效的值。当然你会缓存这个以避免这些额外的200毫秒每次你做查询。

我个人与你在案件。规则说从来没有做...很少没有例外。

+4

规则是指导聪明人和愚人的严格服从...... – 2013-04-30 07:52:30

-2

你的首席建筑师是对的。做他所说的。如果您有兴趣保留没有值的密钥记录,请使用不同的数据结构来存储这些密钥,而不是使用空值缓存这些密钥。我不确定是否有这方面的官方文件,但这是一种标准做法。

1

推测缓存的重点是加速执行并减少不必要的函数调用。

如果向缓存中添加空值可以改善这一点(即总体上降低执行时间),那么添加它们就会有意义。毕竟,缓存的目的是(通常)加快应用程序的某一部分或整个应用程序的速度,而不是将其视为键/值存储区

当然,对于类似的任何事情,您应该先测量一下做任何改变。例如。允许大量的空缓存条目可能会强制出现非空条目,这可能会导致绕过缓存更昂贵。

1

你的总设计师试图成为一个谁是对的,但他不是: 的NullObjectPattern是用来处理“缓存空值” http://en.wikipedia.org/wiki/Null_Object_pattern

在很多情况下,这是一个简单的和面向对象解决方案来处理缓存的信息。 只需获取密钥的值并调用方法即可。该对象知道该怎么做。 没有“ifs”,没有“哦,还有其他列表”和“我们很慢,因为我们试图访问资源来知道,没有什么”。

看看这个:他们做了很多工作,只是为了避免这种“空事”: http://code.google.com/p/guava-libraries/wiki/UsingAndAvoidingNullExplained