Java 为什么缓存使用最近使用的(MRU)算法作为逐出策略?
我知道MRU的算法和它的反向最近最少使用的算法(LRU)Java 为什么缓存使用最近使用的(MRU)算法作为逐出策略?,java,algorithm,caching,Java,Algorithm,Caching,我知道MRU的算法和它的反向最近最少使用的算法(LRU) 我认为LRU是合理的,因为LRU元素意味着它将在未来至少可能被使用。然而,MRU元素意味着该元素很可能在将来使用,为什么要逐出它?合理的情况是什么?想象一下,当公交车到达公交车站时,您正在根据公交车号(或您使用的任何标识符)查找公交车的详细信息 有点合理的想法是,如果你刚刚看到一辆36路公交车,你不太可能马上看到另一辆,而不是看到停在那里的其他公交车 仅举一个例子,但其思想更为普遍:在某些情况下,“刚刚看到某样东西”是一个很好的指标,表明
我认为LRU是合理的,因为LRU元素意味着它将在未来至少可能被使用。然而,MRU元素意味着该元素很可能在将来使用,为什么要逐出它?合理的情况是什么?想象一下,当公交车到达公交车站时,您正在根据公交车号(或您使用的任何标识符)查找公交车的详细信息 有点合理的想法是,如果你刚刚看到一辆36路公交车,你不太可能马上看到另一辆,而不是看到停在那里的其他公交车
仅举一个例子,但其思想更为普遍:在某些情况下,“刚刚看到某样东西”是一个很好的指标,表明您不太可能很快再次看到相同的东西。用例是当您对相同(大于缓存)的数据进行多次迭代时,因此,您将不会返回到最近访问的数据。我认为@Jon Skeet和@Jeremiah Willcock的答案都在描述使用MRU是一种避免使用无用条目对缓存进行争论的方法
- 完全绕过缓存
- 在不进行读通/更新,也不改变LRU链的情况下探测缓存
无论如何,我想不出任何MRU用例不符合这种通用模式
顺便说一句,@Jon Skeet关于公交车到达的例子并不总是在现实中得到证实,这是由于聚集效应
- 如果一辆公共汽车晚点了,很可能会有超过平均水平的人在每个公共汽车站等车。公共汽车必须更频繁地停下来,而且在每一站停留的时间更长。这使晚点的公共汽车慢了下来
- 跟在晚班车后面的一辆准时的公共汽车通常比每个公共汽车站的平均候车人数要少。(因为他们刚刚上了晚班公共汽车。)这加快了后面的公共汽车的速度
- 最终的结果是公共汽车往往会挤在一起
请参阅:假设您正在为音乐会缓存大厅的座位,以加快预订。在应用程序预订座位时,请从缓存中删除缓存项,因为预订应用程序不再需要缓存项。媒体服务器可能是一个更具体的示例。当用户看完一段视频(比如说这是一个电视节目的一集)后,他们可能最不想再看一遍。因此,如果必须逐出某些内容,请逐出最近查看的项目
但在实践中,我相信这种缓存通常是在LRU或LFU缓存之外使用的,在LRU或LFU缓存中,两个缓存串联在一起可以覆盖各种情况。目前乘坐公交车:)?@Petar:碰巧,我现在,但是当我写这篇文章时,我正在火车上:)@JonSkeet这不是违背了时间位置原则吗?@shingaridavesh:你到底是什么意思?@shingaridavesh:是的-你忽略了一个事实,即并非所有情况都是一样的。有时您更可能很快再次使用相同的值,有时您不太可能。这就是为什么有MRU和LRU算法的原因——所以你可以选择最适合你的情况的算法。