5

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

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

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

4

4 回答 4

4

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

我亲自与您讨论此案。规则说永远不会......很少没有例外。

于 2013-04-30T07:49:04.783 回答
2

您的首席架构师试图成为正确的人,但他不是:NullObjectPattern 用于处理“缓存的空值” http://en.wikipedia.org/wiki/Null_Object_pattern

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

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

于 2013-04-30T08:10:45.423 回答
1

大概缓存的目的是加快执行速度并减少不必要的函数调用。

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

当然,对于这样的事情,您应该在进行任何更改之前进行真正的测量。例如,允许大量空缓存条目可能会强制排除非空条目,这可能会导致绕过缓存的成本更高。

于 2013-04-30T08:06:28.597 回答
-2

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

于 2013-04-30T07:45:31.913 回答