我正在与我的首席架构师争论缓存空值。他的观点是,根据定义,空值不会被缓存。
我现在的问题是,总是存在缓存未命中并且总是无需任何需要输入一段代码,因为在我的情况下空值完全没问题。
我的问题:这个案子有官方定义吗?
我正在与我的首席架构师争论缓存空值。他的观点是,根据定义,空值不会被缓存。
我现在的问题是,总是存在缓存未命中并且总是无需任何需要输入一段代码,因为在我的情况下空值完全没问题。
我的问题:这个案子有官方定义吗?
我怀疑这种情况是否有官方文件,因为答案很大程度上取决于您的使用情况。例如,假设您有一个需要 200 毫秒的 Web 查询来处理,它返回 null 并且这是一个有效值。当然,您会缓存它以避免每次执行查询时这些额外的 200 毫秒。
我亲自与您讨论此案。规则说永远不会......很少没有例外。
您的首席架构师试图成为正确的人,但他不是:NullObjectPattern 用于处理“缓存的空值” http://en.wikipedia.org/wiki/Null_Object_pattern
在很多情况下,处理缓存信息是一种简单且面向对象的解决方案。只需获取键的值并调用方法即可。对象知道该做什么。没有“如果”,没有“哦,还有其他列表”和“我们很慢,因为我们试图访问资源以知道什么都没有”。
看看这个:他们做了很多工作,只是为了避免这种“空的东西”: http ://code.google.com/p/guava-libraries/wiki/UsingAndAvoidingNullExplained
大概缓存的目的是加快执行速度并减少不必要的函数调用。
如果向缓存添加空值可以改善这一点(即总体上降低执行时间),那么添加它们将是有意义的。毕竟,缓存的目的(通常)是加速应用程序的一部分或整个应用程序,而不是被视为键/值存储
当然,对于这样的事情,您应该在进行任何更改之前进行真正的测量。例如,允许大量空缓存条目可能会强制排除非空条目,这可能会导致绕过缓存的成本更高。
你的首席架构师是对的。照他说的做。如果您有兴趣保留没有值的键的记录,请使用不同的数据结构来存储这些键,而不是使用空值缓存这些键。我不确定是否有官方文档,但这是一种标准做法。