缓存算法之LRU与LFU

1 LRU算法
1.1 前言
     目前尽量由于摩尔定律,但是在存储硬件始终存在着矛盾,例如在容量方面,内存<外存;而在硬件成本与访问效率方面,内存>外存,并且这种区别是不在同一数量级别的差异。而目前互联网服务平台存在的特点:读多写少,数据规模巨大,长尾效应等等。正是由于场景需求与存储硬件之间的本身矛盾,缓存算法由此产生了。
      一个服务平台其读取过程:总是优先去离CPU最近的地方内存中读取数据,当有限的空间读取命中为空时,则去外存的数据库或文件系统中读取。当有限的缓存空间里“人满为患”时,而又有新的成员需要加入时,自然需要一定的淘汰机制。本能的基础淘汰算法,最后访问时间最久的成员最先会被淘汰(LRU),而队列访问具有先进先出的特点,按最后访问的时间先进先出,所以通常用队列实现LRU。
1.2 基本原理
  a  利用队列类型对象,记录最近操作的元素,总是放在队首,这样最久未操作的元素自然被相对移动到队尾;同时,当元素总数达到上限值时,优先移除与淘汰队尾元素。
  b 利用HashMap辅助对象,快速检索队列中存在的元素。
1.3 操作
  a 写入操作: 新建一个元素,把元素插入队列首,当元素总和达到上限值时,同时删除队尾元素。
  b 读取操作:利用map快速检索,队列相关联的元素。
1.4 实现源码
  a 自定义链表方式

b 利用stl::list类型实现方式

2 LRFU缓存算法
2.1 前言
      缓存算法有许多种,各种缓存算法的核心区别在于它们的淘汰机制。淘汰机制的通常做法:所有元素按某种量化的重要程度进行排序,分值最低者则会被淘汰。而重要程度的量化指标又通常可以参考了两个维度:1. 最后被访问的时间 2. 最近被访问的频率次数。例如如下:

LRU(Least Recently Used ),总是淘汰最后访问时间最久的元素。这种算法存在问题:可能由于一次批量冷数据的查询而误淘汰大量热点的数据。

LFU(Least Frequently Used ),总是淘汰最近访问频率最小的元素。这种算法也存在明显的问题:

a 如果频率时间度量是1小时,则平均每个小时内的访问频率1000的热点数据可能会某段时间的随机访问频率是1001的数据剔除掉;b 最近新加入的数据总会易于被剔除掉,由于其开始的频率低。本质上重要性访问频率是指在多长的时间段内的频率?其难以标定,在业界很少单一直接使用。由于两种算法的各自特点及缺点,所以通常在生产线上会根据业务场景联合LRU与LFU一起使用,称之为LRFU。

2.2 实现机制
     我们在LRU实现基础上稍作衍生,能实现LRFU缓存机制,即可以采用队列分级的思想,例如oracle利用两个队列维护访问的数据元素,按被访问的频率的维度把元素分别搁在热端与冷端队列;而在同一个队列内,最后访问时间越久的元素会越被排在队列尾。

   参考
 a https://en.wikipedia.org/wiki/Least_frequently_used
 b
 c

时间: 2024-10-15 10:49:25

缓存算法之LRU与LFU的相关文章

缓存算法:LRU、LFU、FIFO

  LRU全称是Least Recently Used,即最近最久未使用的意思.如果一个数据在最近一段时间没有被访问到,那么在将来它被访问的可能性也很小.也就是说,当限定的空间已存满数据时,应当把最久没有被访问到的数据淘汰. LFU(Least Frequently Used)最近最少使用算法.它是基于"如果一个数据在最近一段时间内使用次数很少,那么在将来一段时间内被使用的可能性也很小"的思路.注意LFU和LRU算法的不同之处,LRU的淘汰规则是基于访问时间,而LFU是基于访问次数的.

缓存算法(FIFO 、LRU、LFU三种算法的区别)

缓存算法(FIFO .LRU.LFU三种算法的区别) FIFO算法# FIFO 算法是一种比较容易实现的算法.它的思想是先进先出(FIFO,队列),这是最简单.最公平的一种思想,即如果一个数据是最先进入的,那么可以认为在将来它被访问的可能性很小.空间满的时候,最先进入的数据会被最早置换(淘汰)掉. FIFO 算法的描述:设计一种缓存结构,该结构在构造时确定大小,假设大小为 K,并有两个功能: set(key,value):将记录(key,value)插入该结构.当缓存满时,将最先进入缓存的数据置

[转]缓存、缓存算法和缓存框架简介

以下内容转自:http://www.leexiang.com/cache-algorithm (转载请注明出处)-----------------------------------分割线---------------------------------------------- 引言 我们都听过 cache,当你问他们是什么是缓存的时候,他们会给你一个完美的答案,可是他们不知道缓存是怎么构建的,或者没有告诉你应该采用什么标准去选择缓存框架.在这边文章,我们会去讨论缓存,缓存算法,缓存框架以及哪

缓存、缓存算法和缓存框架

译者:lixiang 译文:http://www.zavakid.com/25 原文:http://www.jtraining.com/component/content/article/35-jtraining-blog/98.html 引言 我们都听过 cache,当你问他们是什么是缓存的时候,他们会给你一个完美的答案,可是他们不知道缓存是怎么构建的,或者没有告诉你应该采用什么标准去选择缓存框架.在这边文章,我们会去讨论缓存,缓存算法,缓存框架以及哪个缓存框架会更好. 面试 “缓存就是存贮数

缓存、缓存算法和缓存框架简介

文章转载于:http://blog.jobbole.com/30940/ 引言 我们都听过 cache,当你问他们是什么是缓存的时候,他们会给你一个完美的答案,可是他们不知道缓存是怎么构建的,或者没有告诉你应该采用什么标准去选择缓存框架.在这边文章,我们会去讨论缓存,缓存算法,缓存框架以及哪个缓存框架会更好. 面试 “缓存就是存贮数据(使用频繁的数据)的临时地方,因为取原始数据的代价太大了,所以我可以取得快一些.” 这就是 programmer one (programmer one 是一个面试

缓存算法

引言 我们都听过 cache,当你问他们是什么是缓存的时候,他们会给你一个完美的答案,可是他们不知道缓存是怎么构建的,或者没有告诉你应该采用什么标准去选择缓存框架.在这边文章,我们会去讨论缓存,缓存算法,缓存框架以及哪个缓存框架会更好. 面试 “缓存就是存贮数据(使用频繁的数据)的临时地方,因为取原始数据的代价太大了,所以我可以取得快一些.” 这就是 programmer one (programmer one 是一个面试者)在面试中的回答(一个月前,他向公司提交了简历,想要应聘要求在缓存,缓存

android上的缓存、缓存算法和缓存框架

1.使用缓存的目的 缓存是存取数据的临时地,因为取原始数据代价太大了,加了缓存,可以取得快些.缓存可以认为是原始数据的子集,它是从原始数据里复制出来的,并且为了能被取回,被加上了标志. 在android开发中,经常要访问网络数据比如大量网络图片,如果每次需要同一张图片都去网络获取,这代价显然太大了.可以考虑设置本地文件缓存和内存 缓存,存储从网络取得的数据:本地文件缓存空间并非是无限大的,容量越大读取效率越低,可设置一个折中缓存容量比如10M,如果缓存已满,我们需要采用合 适的替换策略换掉一个已

java缓存算法【转】

http://my.oschina.net/u/866190/blog/188712 提到缓存,不得不提就是缓存算法(淘汰算法),常见算法有LRU.LFU和FIFO等算法,每种算法各有各的优势和缺点及适应环境. 1.LRU(Least Recently Used ,最近最少使用)算法根据数据的最近访问记录来淘汰数据,其原理是如果数据最近被访问过,将来被访问的几概率相对比较高,最常见的实现是使用一个链表保存缓存数据,详细具体算法如下:1. 新数据插入到链表头部:2. 每当缓存数据命中,则将数据移到

[转] 通俗讲解:缓存、缓存算法和缓存框架

通俗讲解:缓存.缓存算法和缓存框架 1引言 我们都听过 cache,当你问他们是什么是缓存的时候,他们会给你一个完美的答案,可是他们不知道缓存是怎么构建的,或者没有告诉你应该采用什么标准去选择缓存框架.在这边文章,我们会去讨论缓存,缓存算法,缓存框架以及哪个缓存框架会更好. 2面试 “缓存就是存贮数据(使用频繁的数据)的临时地方,因为取原始数据的代价太大了,所以我可以取得快一些.” 这就是 programmer one (programmer one 是一个面试者)在面试中的回答(一个月前,他向