这篇写的略为纠结,算法原理、库都是现成的,我就调用了几个函数而已,这有啥好写的?不过想了想,还是可以介绍一下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. Microsoft Azure 配置负载均衡

    负载均衡大家都知道是什么了吧,就不用介绍了.如何在 microsoft Azure 上配置了?创建两台虚拟机,并加入如云服务.然后在远处登录上去,有时你想在两台虚拟机上通信,怎么办,比如mymv2 p ...

  2. HTTP传输内容的压缩

    最近在看尤大的ssr项目的demo,看他的项目里有用到compression,完全看不懂这是什么鬼,然后百度了一下,文档也都是英文的,看着有点吃力,隐约的觉得这是压缩http请求的,做前端的都知道,在 ...

  3. Sed - An Introduction and Tutorial by Bruce Barnett

    http://www.grymoire.com/unix/sed.html Quick Links - NEW Sed Commands : label # comment {....} Block ...

  4. [LNMP]——LNMP环境配置

    LNMP=Linux+Nginx+Mysql+PHP Install Nginx //安装依赖包 # yum install openssl openssl-devel zlib-devel //安装 ...

  5. bootstrap-select在angular上的应用

    1.bootstrap-select 依赖bootstrap.js ,又依赖jQuery,这些都可以用requirejs来处理. 2.一般bootstrap-select 都放在具体的模块上,而是动态 ...

  6. ComboBox ItemHeight 再高一点

    public static void BindData(this ComboBox box, List<KeyValuePair<long, string>> data) { ...

  7. Maven --- <distributionManagement>标签

    1.<distributionManagement>的作用: 负责管理构件的发布.这是一个环境变量    <downloadUrl> URL </downloadUrl& ...

  8. json转换工具类

    using System;using System.Collections.Generic;using System.Text;using Newtonsoft.Json;using System.I ...

  9. zookeeper学习实践1-实现分布式锁

    引言 ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件.它是一个为分布式应用提供一致性服务的软件,提 ...

  10. 在vue中安装使用vux

    最近因为的工作的原因在弄vue,从后端弄到前端之前一直用js,现在第一次接触vue感觉还挺有意思的,就是自己太菜了,这个脑子呀....不太够用.....页面设计用了一个叫vux的东西,vux可以提供一 ...