LRU-K具有LRU的优点,同时能够避免LRU的缺点,实际应用中LRU-2是综合各种因素后最优的选择,LRU-3或者更大的K值命中率会高,但适应性差,需要大量的数据访问才能将历史访问记录清除掉。 二、Two queues(2Q) 1、算法思想 该算法类似于LRU-2,不同点在于2Q将LRU-2算法中的访问历史队列(注意这不是缓存数据的)改为一个FIFO缓存队列,即:2Q算法有两个缓存队列,一个是
LRU-2,只有当数据的访问次数达到2次的时候,才将数据放入缓存。当需要淘汰数据时,LRU-2会淘汰第2次访问时间距当前时间最大的数据。可以拓展为LRU-K。 2Q(Two queues):LRU2的改进,不同点在于2Q将LRU-2算法中的访问历史队列改为一个FIFO缓存队列(即包含FIFO队列和LRU队列)。
最常用的是LRU-2 Redis的lru实现 回收策略 volatile-lru -> 根据LRU算法删除设置了超时属性(expire)的键,直到腾出足够空间为止。
实际场景下偶尔会有大量的单次查询出现(比如爬虫),由于采用的是LRU策略,如果没有合适的清洗策略,很容易发生新产生的低复用率缓存将正常运行的高复用率缓存踢出的情况,为此,我们参考了lru-2的方式来避免缓存污染
存在问题: 这种算法和LRU-2一致,适应性差,存在LRU中的数据需要大量的访问才会将历史记录清除掉。
return size == 0; } } 其他淘汰策略: 随机清理 根据内容长度清理 MRU(Most recently used):与LRU相反,当缓存区满了的时候,总是移除最近最常使用的条目 LRU
基于最近一段时间内的访问情况进行淘汰 能够平衡最近访问和长期访问的数据 实现较复杂,需要维护最近访问的记录 LRU
研究者提出了多种改进版本:LRU-K:不仅考虑最近一次访问,而是记录最近K次访问的时间戳(例如LRU-2关注最近两次访问),通过更复杂的统计模型预测数据的未来访问概率。
LRU-K具有LRU的优点,同时还能避免LRU的缺点,实际应用中LRU-2是综合最优的选择。由于LRU-K还需要记录那些被访问过、但还没有放入缓存的对象,因此内存消耗会比LRU要多。 two queue Two queues(以下使用2Q代替)算法类似于LRU-2,不同点在于2Q将LRU-2算法中的访问历史队列(注意这不是缓存数据的)改为一个FIFO缓存队列,即:2Q算法有两个缓存队列
例如,SQL Server 使用 LRU-2。 这个算法的原理是把更多的历史记录考虑进来。简单LRU(也就是 LRU-1),只考虑最后一次使用的数据。
例如,SQL Server 使用 LRU-2。这个算法的原理是把更多的历史记录考虑进来。简单LRU(也就是 LRU-1),只考虑最后一次使用的数据。