2013-10-08 98 views
2

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

我在3个不同的问题解释,以防止需要提供更多的等等解释/数据不全的问题

回答

2

换句话说不会被认为是缓存的对象的arraylist?

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

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

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

缓存解决的问题是:

如何访问一个数据结构,是耗时通过一些简单的引用数据快速获取?

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

回到最初的问题

换句话说

惯于对象的ArrayList被认为是缓存?

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

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

这就是HashMap的工作原理。

0

我想,这是不是使用特定的策略,它的所有缓存的目标。

什么是从缓存预期 - 一个很好的指针可以是http://commons.apache.org/proper/commons-jcs/

键值对容易与许多流行的算法(包括Apache之一)配合来实现高速缓存,因此成为一个自然的候选。

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