这篇博客主要介绍LRU LFU 算法,因为在Mybatis的缓存中会用到,所以放到这个系列中了。此外,这是我翻译的一篇文章,觉得原文已经写的很好了,所以就直接翻译一下,留作知识整理。

英文原文出处如下:

https://xuri.me/2016/08/13/lru-and-lfu-cache-algorithms.html

鼓励大家多读读英文的资料。好处不多说。自己体会。

在此声明,文章只是翻译了一个大体意思,有些词汇翻译的不准确,不要砸我。

最少最近使用(LRU)

丢弃掉最近期间最少使用的项目。当想要丢弃掉最近期间最少使用的项目时,算法要求必须追踪哪些是使用了的。这种技术的广义上的实施,要求为每个cache-line保存寿命信息,并且在寿命信息的基础上,追踪最近期间最少使用的cache-line。在这样的功能实现中,每次使用一个cache-line,并改变其他cache-line的寿命信息。

P.S. 每一列可以看做是一个cache-line。

最近期间内经常使用(LFU)

最近期间内经常使用是一种用计算机管理内存的算法。关于这种方法的标准的特征是,系统追踪在内存中,block被引用的次数。当内存满了,需要等多的空间时,系统会去除掉最少使用次数的项目。

使用LFU算法,最简单的方法是,为每个导入内存中的block安排计数器。每一次block被引用一次,计数器就会自动加一。当内存达到容量并且有新的block被插入时,系统将会查找使用次数最少的项目,将它从内存中除去。

LRU 和 LFU 的不同之处如下:

比如,内存容量是3,数据操作的序列如下,

set(2,2), set(1,1), get(2), get(1), get(2), set(3,3), set(4,4)

set(4,4)时,LFU算法will会清除掉(3,3), LRU会清除掉(1,1).

P.S.东西很简单,自己动手在纸上画画,就明白了。

接下来,写一个简单的demo,用java来实现LRU算法。

 public class Demo01 {

     LinkedHashMap<Integer, String> cache;
public void sddd() {

// 构造函数中的三个参数分别是:
// param1: 初始化容器大小
// param2:负载因子(当容器大小到达这个比例时,就会扩容)
// param3:true 按照使用的顺序将数据排序
false 按照插入容器的顺序将数据排序
// LinkedHashMap 是有序的
cache = new LinkedHashMap<Integer,String>(4, (float) 0.75, true){
private static final long serialVersionUID = 1;
         // 当容器大小超过100时,会将超过的entity删除
@Override
public boolean removeEldestEntry(@SuppressWarnings("rawtypes") Map.Entry eldest) {
return size() > 100;
}
};
}
}

Mybatis(七)-- LRU LFU 算法的更多相关文章

  1. 页面置换算法(最佳置换算法、FIFO置换算法、LRU置换算法、LFU置换算法)

    页面置换产生的原因是:分页请求式存储管理(它是实现虚拟存储管理的方法之一,其中一个特性是多次性-->多次将页面换入或换出内存) 效果最好的页面置换算法:最佳置换算法 比较常用的页面置换算法有:F ...

  2. LRU LFU FIFO 转载

    -------------------------------------->href--------------------------> http://blog.chinaunix.n ...

  3. 面试挂在了 LRU 缓存算法设计上

    好吧,有人可能觉得我标题党了,但我想告诉你们的是,前阵子面试确实挂在了 RLU 缓存算法的设计上了.当时做题的时候,自己想的太多了,感觉设计一个 LRU(Least recently used) 缓存 ...

  4. Redis中的LFU算法

    在Redis中的LRU算法文中说到,LRU有一个缺陷,在如下情况下: ~~~~~A~~~~~A~~~~~A~~~~A~~~~~A~~~~~A~~| ~~B~~B~~B~~B~~B~~B~~B~~B~~ ...

  5. 如何用LinkedHashMap实现LRU缓存算法

    阿里巴巴笔试考到了LRU,一激动忘了怎么回事了..准备不充分啊.. 缓存这个东西就是为了提高运行速度的,由于缓存是在寸土寸金的内存里面,不是在硬盘里面,所以容量是很有限的.LRU这个算法就是把最近一次 ...

  6. 经典算法题每日演练——第七题 KMP算法

    原文:经典算法题每日演练--第七题 KMP算法 在大学的时候,应该在数据结构里面都看过kmp算法吧,不知道有多少老师对该算法是一笔带过的,至少我们以前是的, 确实kmp算法还是有点饶人的,如果说红黑树 ...

  7. 搜索引擎算法研究专题七:Hilltop算法

    搜索引擎算法研究专题七:Hilltop算法 2017年12月19日 ⁄ 搜索技术 ⁄ 共 1256字 ⁄ 字号 小 中 大 ⁄ 评论关闭   HillTop也是搜索引擎结果排序的专利,是Google工 ...

  8. 缓存子系统如何设计(Cachable tag, Memcache/redis support, xml config support, LRU/LFU/本地缓存命中率)

    大家对这段代码肯定很熟悉吧: public List<UserInfo> SearchUsers(string userName) { string cacheKey=string.For ...

  9. 缓存失效策略(FIFO,LRU,LFU)

    当缓存需要被清理时(比如空间占用已经接近临界值了),需要使用某种淘汰算法来决定清理掉哪些数据.常用的淘汰算法有下面几种: 1. FIFO:First In First Out,先进先出.判断被存储的时 ...

随机推荐

  1. 计算机基础part1

    一:计算机的基本组成 1.计算机由输入单元.控制单元.算法逻辑单元.输出单元.存储单元,五大单元组成 二:概念篇 CPU:中央处理器,其内含有指令集(取码-解码-执行的过程) CPU同一时刻只能干一件 ...

  2. unity中手机触摸代码

    #elif UNITY_IOS || UNITY_ANDROID         if(Input.touchCount <= 0)         {             return;/ ...

  3. HTTP协议详细解析

    HTTP协议详解 HTTP协议(HyperText Transfer Protocol,超文本传输协议)是因特网上应用最为广泛的一种网络传输协议,所有的WWW文件都必须遵守这个标准. HTTP是一个基 ...

  4. FPGA低温不能启动分析(转)

    FPGA低温不能启动分析 现象描述:在给medium板光端机做低温试验时,分别给发送版.接收板断电重新启动,发现有的板子在-40°可以启动,而有些板子在-20°都不能启动,需要升高温度到0°以上才能启 ...

  5. maven 打包前 Junit 测试

    1. 在需要打包前测试的项目中添加依赖 <dependency> <groupId>junit</groupId> <artifactId>junit& ...

  6. SQL--数据--基本操作

    数据操作 新增数据 有两种方案方案1:给全表字段插入数据,不需要指定字段列表:要求数据的值出现的顺序必须与表中设计的字段出现的顺序一致:凡是非数值数据,都需要使用引号(建议是单引号)包裹 insert ...

  7. L313 珊瑚裸鼠灭绝

    This week the Australian government declared the extinction of a tiny rodent called Bramble Cay melo ...

  8. 深入了解HyperServer

    本文,我们将尝试深入了解uniGUI HyperServer. 可以将HyperServer所有功能分成三类: HyperServer和稳定性 HyperServer和可扩展性 HyperServer ...

  9. L2-001. 紧急救援(最短路的变形)*

    L2-001. 紧急救援 #include <cstdio> #include <algorithm> using namespace std; ; int const INF ...

  10. ES6 箭头函数--特性

    如果箭头表达式仅仅就是简化了函数的命名,我们为什么要改变原来的习惯而去使用它呢?所以我们需要了解一下箭头函数的特性. 箭头函数内部没有constructor方法,也没有prototype,所以不支持n ...