这篇写的略为纠结,算法原理、库都是现成的,我就调用了几个函数而已,这有啥好写的?不过想了想,还是可以介绍一下LRU算法的原理及简单的用法。
 
LRU(Least Recently Used,最近最少使用)是一种内存页面置换算法。什么叫内存页面置换?我们知道,相对于内存的速度来讲,磁盘的速度是很慢的。我们需要查询数据的时候,不能每次都跑到磁盘去查,需要在内存里设置一块空间,把一些常用的数据放在这块空间里,以后查的时候就直接在这里查,而不必去磁盘,从而起到“加速”的作用。但是这块空间肯定是远远小于磁盘大小的。那么什么样的数据放在这里才合适呢?当然是常用的数据。那什么样的数据是“常用”的数据呢?这里就有几种策略了。比如最简单FIFO(先进先出),RR(时间片轮转)等等,当然这就是我们最熟悉的队列和堆栈的做法。LRU也是这样一种策略,它的思想是基于这样一种观察和假定:最近经常访问的数据,在所有数据中也是最常访问的。所以,在这样一块空间中,最近被访问过的页面被当做“频繁访问”的,而一直没有被访问过的则被替换出去。这种思想是操作系统存储管理中最常见的方式之一,而目前也被广泛的应用为“缓存”的概念。缓存思想应用的也是相当广泛的,比如寄存器,比如内存,还有网络、数据库、IO等等方面,只要有输入/输出速度不匹配的地方,缓存就可以作为强有力的武器。
 
扯的有点远。接下来讲讲LRU算法的原理吧。假设我们开了可怜的一小块空间作为缓存,只能存5个数,页面编号为0,1,2,3,4。然后需要查询的一串序列为:4,7,0,7,1,0,1,2,1,2,6。那么将会出现如下图所示的情况:
整个查询过程为:
查询4,缓存中不存在,到磁盘中查,并把4放在缓存中;
查询7,类似上面的情况;
查询0,类似上面的情况;
查询7,直接在缓存中查到了,那么7作为“最近”查过的数据,放在最新的位置;
查询1,缓存中不存在,到磁盘中查,并把4放在缓存中;
查询0,直接在缓存中查到了,那么0作为“最近”查过的数据,放在最新的位置;
。。。。。。
后面依此类推。
 
现在大概清楚LRU是个怎样的算法,以及为什么可以作为缓存来使用了吧。这里有一篇文章分析的不错,可以参考一下:图解缓存淘汰算法一之LRU
现在我的项目中需要用到缓存了,可是忘了名字,只记得大概的原理,就去群里问道:我需要这样一个数据结构,查询效率高,类似字典和队列,但最近访问过的数据最后出队,很久没有访问过的数据就先被踢出去。群里大神指点我去看看LRUCache,恍然大悟,就是这个名字!于是百度了一下,结果找到了不少原理和java实现(比如 http://dennis-zane.iteye.com/blog/128278),就是没看到python的。于是到群里请教大神,大神一语中的:pylru。又去百度了一下,果然有这东西!
pylru可以使用pip安装,可以到pypi上查看下载及使用方法:https://pypi.python.org/pypi/pylru/1.0.9  使用起来又炒鸡简单,按某人的话来说就是:你们python真不要脸。
这个库是纯粹用python写的,有兴趣可以看看它的实现。库十分短小精悍,只有几百行代码,注释还占了一多半。
 
测试:
有点啰嗦了,不过这样结果也很清楚。
如果将来涉及到要写缓存了,能想起来这个东西,就是幸运。这也是我们为什么建议掌握一定的算法基础,以及操作系统、体系结构等基础课程的原因:并不是在实践中让你真的去写一个排序算法,写一个缓存,而是当你在某种场合下,能突然意识到:这特么不就是个XXX算法吗,我以前接触过的。比自己吭哧吭哧半天写出来个诡异的数据结构要好的多。
 
本文参考:
1、《现代操作系统》第四章:存储管理:4.4:页面置换算法
3、360图书馆:图解缓存淘汰算法一之LRU :http://www.360doc.com/content/14/0704/09/10504424_391894263.shtml
4、ITEye:LRUCache的java版本实现:http://dennis-zane.iteye.com/blog/128278
5、PyPI:pylru下载及使用:https://pypi.python.org/pypi/pylru/1.0.9

LRU缓存算法与pylru的更多相关文章

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

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

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

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

  3. HashMap+双向链表手写LRU缓存算法/页面置换算法

    import java.util.Hashtable; class DLinkedList { String key; //键 int value; //值 DLinkedList pre; //双向 ...

  4. LRU缓存算法 - C++版

    LRU是Least Recently Used的缩写,意思是最近最少使用,它是一种Cache替换算法. 实现思路: hashtable + 双向链表 时间复杂度: 插入,查找,删除:O(1) 空间使用 ...

  5. Java 自定义实现 LRU 缓存算法

    背景 LinkedHashMap继承自HashMap,内部提供了一个removeEldestEntry方法,该方法正是实现LRU策略的关键所在,且HashMap内部专门为LinkedHashMap提供 ...

  6. LinkedHashMap实现LRU缓存算法

    LinkedHashMap的get()方法除了返回元素之外还可以把被访问的元素放到链表的底端,这样一来每次顶端的元素就是remove的元素. 构造函数如下: public LinkedHashMap  ...

  7. LRU缓存算法

    http://blog.csdn.net/beiyeqingteng/article/details/7010411 http://blog.csdn.net/wzy_1988/article/det ...

  8. 算法进阶面试题06——实现LFU缓存算法、计算带括号的公式、介绍和实现跳表结构

    接着第四课的内容,主要讲LFU.表达式计算和跳表 第一题 上一题实现了LRU缓存算法,LFU也是一个著名的缓存算法 自行了解之后实现LFU中的set 和 get 要求:两个方法的时间复杂度都为O(1) ...

  9. LRU缓存原理

    LRU(Least Recently Used)  LRU是近期最少使用的算法,它的核心思想是当缓存满时,会优先淘汰那些近期最少使用的缓存对象. 采用LRU算法的缓存有两种:LrhCache和DisL ...

随机推荐

  1. DBUtils工具类的使用

    DBUtils工具类1.DBUtils工具类,由apache组织提供的工具类,对JDBC做了一些简单封装. 做了查询的封装,把查询的结果封装到List集合 Map集合 JavaBean对象中 做了增删 ...

  2. vue-cli 基础搭建

    1.安装node 2.npm install webpack -g 3.npm install vue-cli -g 4.然后进入到文件下边 vue init webpack 文件名字 5.进入工程文 ...

  3. React.js 小书 Lesson21 - ref 和 React.js 中的 DOM 操作

    作者:胡子大哈 原文链接:http://huziketang.com/books/react/lesson21 转载请注明出处,保留原文链接和作者信息. 在 React.js 当中你基本不需要和 DO ...

  4. KVC、KVO实现过程

    1.KVC的实现过程 以 [object setValue:@"134567" forKey:@"uid"];为例子,来探究KVC的实现过程 第一步:搜索1.首 ...

  5. js confirm实现换行

    js中confirm或者alert不识别标签,所以要换行的话可以采用下面方式 \u000d 或者 \r: <script> var res=confirm(\"这是测试工作: \ ...

  6. efcore 配置链接sqlserver

    本文将在asp.net core api 项目中使用efcore corefirst模式 简单配置链接sqlserver数据库,以及简单的数据库迁移操作 一 新建项目 1. 首先我们先用vs2017 ...

  7. 十、集成使用redis

    一.简介 redis是一种非关系型数据库,它的数据结构是key-value的存储形式:能够支持多种类型的数据存储,如:string/list/map/object...等.springboot自然也对 ...

  8. 3 TFRecord样例程序实战

    将图片数据写入Record文件 # 定义函数转化变量类型. def _int64_feature(value): return tf.train.Feature(int64_list=tf.train ...

  9. 删除List中指定的元素

    删除List中指定的元素 CopyOnWriteArrayList是ArrayList的一个线程安全的变体实现,即可在多线程并发环境中使用 List<Map<String, Object& ...

  10. Java—进程与线程

    进程与线程 进程是程序(任务)的执行过程,具有动态性:持有资源(共享内存.共享文件)和线程,是资源和线程的载体. 线程是系统中最小的执行单元,同一进程中有多个线程,线程共享进程的资源. 线程的交互,交 ...