缓存需要是键值对吗?

时间:2013-10-08 05:47:03

标签: java caching memcached linkedhashmap

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

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

2 个答案:

答案 0 :(得分:2)

  

换句话说,不会将对象的arraylist视为缓存吗?

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

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

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

缓存解决的问题是:

  

如何通过一些简单的参考数据快速获取快速获取的数据结构?

因此,您总是拥有一些数据,这些数据只是难以获得的数据结构的参照物,例如:顾客号 - &GT;顾客。这些引用数据称为缓存密钥。它是一种简单的数据结构,具有足够的信息来创建或获取更复杂的数据结构。所以它只是一个映射,因此缓存通常由地图数据结构实现。

回到最初的问题

  

换句话说,不会将对象的arraylist视为缓存吗?

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

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

这就是HashMap的工作原理。

答案 1 :(得分:0)

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

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

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

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