【问题标题】:Do caches need to be key-value pair?缓存是否需要是键值对?
【发布时间】:2013-10-08 05:47:03
【问题描述】:
据我了解,缓存是将数据存储在方便的位置,以便快速访问。缓存的每个实现(例如:LinkedHashMap、MemcacheD)都是键值存储。这是有道理的,我同意。但我的问题是默认情况下缓存是否也意味着键值?换句话说,对象的数组列表不会被视为缓存吗?换句话说,如果在实现 LRU 缓存时,我需要数据是 Entry<key, value> 对象吗?
我在 3 个不同的问题中进行了解释,以防止出现需要更多解释/提供不完整数据等问题。
【问题讨论】:
标签:
java
caching
memcached
linkedhashmap
【解决方案1】:
换句话说,对象的arraylist不会被视为缓存吗?
是的,您可以将其用作缓存。数组索引就是你的缓存键。
数组列表的问题是你通常不能从索引到对象。我的意思是索引通常不是您将其映射到的数据的有意义的参考数据。
如果您考虑为什么缓存是基于键值的,则必须考虑缓存解决的问题。
缓存解决的问题是:
如何通过一些容易引用的数据快速获取耗时的数据结构?
因此,您总是有一些数据只是难以获得的数据结构的参考,例如客户编号-> 客户。这些参考数据称为缓存键。它是一种简单的数据结构,具有足够的信息来创建或获得更复杂的数据结构。所以它只是一个映射,因此缓存通常由映射数据结构实现。
回到最初的问题
换句话说,对象的arraylist不会被视为缓存吗?
我们现在可以理解,使用数组意味着您拥有的引用数据只是一个整数。所以数组列表缓存通常会非常碎片化,有很多未使用的空间。想想客户编号。 -> 客户 示例。在这个例子中,数组列表的大小必须至少是最大的客户编号。这是缓存的,如果新客户的客户数量更大,它会增长。应该被缓存。
如果我们想优化这一点,我们必须找到一种方法将完整的整数范围映射到一个非常小的范围。但如果我们这样做,可能会有两个客户没有。映射到相同的索引。这样我们就会发生碰撞。为了解决这个问题,我们必须引入使用列表或某种链接数据结构来将所有具有相同值的对象保存在某个位置。
HashMap 就是这样工作的。