3

据我了解,缓存是将数据存储在方便的位置,以便快速访问。缓存的每个实现(例如:LinkedHashMap、MemcacheD)都是键值存储。这是有道理的,我同意。但我的问题是默认情况下缓存是否也意味着键值?换句话说,对象的数组列表不会被视为缓存吗?换句话说,如果在实现 LRU 缓存时,我需要将数据作为Entry<key, value>对象吗?

我在 3 个不同的问题中进行了解释,以防止需要更多解释/提供的数据不完整等问题。

4

2 回答 2

4

换句话说,对象的数组列表不会被视为缓存吗?

是的,您可以将其用作缓存。数组索引就是你的缓存键。

数组列表的问题是您通常无法从索引中建议对象。我的意思是索引通常不是您将其映射到的数据的有意义的参考数据。

如果您考虑为什么缓存是基于键值的,您必须考虑缓存解决的问题。

缓存解决的问题是:

如何通过一些容易引用的数据来访问一个耗时耗力的数据结构?

因此,您总是有一些数据只是难以获得的数据结构的参考,例如客户编号。-> 客户。这些参考数据称为缓存键。它是一种简单的数据结构,具有足够的信息来创建或获得更复杂的数据结构。所以它只是一个映射,因此缓存通常由映射数据结构实现。

回到最初的问题

换句话说,对象的数组列表不会被视为缓存吗?

我们现在可以理解,使用数组意味着您拥有的引用数据只是一个整数。所以数组列表缓存通常会非常碎片化,有很多未使用的空间。想想客户没有。-> 客户示例。在这个例子中,数组列表的大小必须至少是最大的客户编号。这是缓存的,如果新客户的客户数量更大,它会增长。应该被缓存。

如果我们想优化这一点,我们必须找到一种方法将完整的整数范围映射到一个非常小的范围。但如果我们这样做,可能会有两个客户没有。映射到相同的索引。这样我们就会发生碰撞。为了处理这个问题,我们必须引入使用列表或某种链接数据结构来将所有具有相同值的对象保存在一个位置。

这就是 a 的HashMap工作方式。

于 2013-10-08T06:24:41.127 回答
0

我认为,这不是关于使用特定的策略,而是关于缓存的目标。

缓存的预期 - 一个好的指针可能是http://commons.apache.org/proper/commons-jcs/

键值对很容易适应许多流行的算法(包括 apache 算法)来实现缓存,因此成为自然的候选者。

但是,我认为使用任何其他可能不是基于键值对的算法都没有问题。在这种情况下,您可能需要从头开始编写缓存方案的新实现。

于 2013-10-08T05:55:33.683 回答