python实现LRU热点缓存及原理
LRU
LRU(Least recently used,最近最少使用)算法根据数据的历史访问记录来进行淘汰数据,其核心思想是“如果数据最近被访问过,那么将来被访问的几率也更高”。
基于列表+Hash的LRU算法实现。
- 访问某个热点时,先将其从原来的位置删除,再将其插入列表的表头
- 为使读取及删除操作的时间复杂度为O(1),使用hash存储热点的信息的键值
class LRUCaceh(): def __init__(self, size=5): ''' 默认队列的长度为5 使用列表来维护,使用字典来查询 ''' self.size = size self.cache = dict() self.key = [] def get(self, key): ''' 获取缓存中的key的值 ''' if self.cache.get(key): self.key.remove(key) self.key.insert(0, key) return self.cache[key] return None def set(self, key, value): ''' 设置缓存,实现缓存淘汰 ''' if self.cache.get(key): self.cache.pop(key) self.cache[key] = value self.key.remove(key) self.key.insert(0, key) elif len(self.key) == self.size: old_key = self.key.pop() self.key.insert(0, key) self.cache.pop(old_key) self.cache[key] = value else: self.key.insert(0, key) self.cache[key] = value
总结
以上所述是小编给大家介绍的python实现LRU热点缓存及原理,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!
相关推荐
-
用Python中的__slots__缓存资源以节省内存开销的方法
我们曾经提到,Oyster.com的Python web服务器怎样利用一个巨大的Python dicts(hash table),缓存大量的静态资源.我们最近在Image类中,用仅仅一行__slots__代码,让每个6G内存占用的服务进程(共4个),省出超过2G来. 这是其中一个服务器在部署代码前后的截图: 我们alloc了大约一百万个类似如下class的实例: class Image(object): def __init__(self, id, caption, url):
-
python中stdout输出不缓存的设置方法
考虑以下python程序: 复制代码 代码如下: #!/usr/bin/env python import sys sys.stdout.write("stdout1 ")sys.stderr.write("stderr1 ")sys.stdout.write("stdout2 ")sys.stderr.write("stderr2 ") 其中的sys.stdout.write也可以换成print.运行这程序,你觉得会输出什么
-
Python实现的一个简单LRU cache
起因:我的同事需要一个固定大小的cache,如果记录在cache中,直接从cache中读取,否则从数据库中读取.python的dict 是一个非常简单的cache,但是由于数据量很大,内存很可能增长的过大,因此需要限定记录数,并用LRU算法丢弃旧记录.key 是整型,value是10KB左右的python对象 分析: 1)可以想到,在对于cache,我们需要维护 key -> value 的关系 2)而为了实现LRU,我们又需要一个基于时间的优先级队列,来维护 timestamp ->
-
Python的Flask框架使用Redis做数据缓存的配置方法
Redis是一款依据BSD开源协议发行的高性能Key-Value存储系统.会把数据读入内存中提高存取效率.Redis性能极高能支持超过100K+每秒的读写频率,还支持通知key过期等等特性,所以及其适合做缓存. 下载安装 根据redis中文网使用wget下载压缩包 $ wget http://download.redis.io/releases/redis-3.0.5.tar.gz $ tar xzf redis-3.0.5.tar.gz $ cd redis-3.0.5 $ make 二进制文
-
浅谈Python的Django框架中的缓存控制
关于缓存剩下的问题是数据的隐私性以及在级联缓存中数据应该在何处储存的问题. 通常用户将会面对两种缓存: 他或她自己的浏览器缓存(私有缓存)以及他或她的提供者缓存(公共缓存). 公共缓存由多个用户使用,而受其他某人的控制. 这就产生了你不想遇到的敏感数据的问题,比如说你的银行账号被存储在公众缓存中. 因此,Web 应用程序需要以某种方式告诉缓存那些数据是私有的,哪些是公共的. 解决方案是标示出某个页面缓存应当是私有的. 要在 Django 中完成此项工作,可使用 cache_control 视图修
-
使用python删除nginx缓存文件示例(python文件操作)
调用时输入参数如: www.jb51.net/表示删除www.jb51.net首页的缓存, www.jb51.net/test.php就表示删除/test.php的缓存 复制代码 代码如下: #coding=utf8import sys,osimport hashlibif len(sys.argv)<2: print("你没有输入地址.") sys.exit()path="/home/cache"#缓存目录md5v = hashlib.md5(
-
python实现LRU热点缓存及原理
LRU LRU(Least recently used,最近最少使用)算法根据数据的历史访问记录来进行淘汰数据,其核心思想是"如果数据最近被访问过,那么将来被访问的几率也更高". 基于列表+Hash的LRU算法实现. 访问某个热点时,先将其从原来的位置删除,再将其插入列表的表头 为使读取及删除操作的时间复杂度为O(1),使用hash存储热点的信息的键值 class LRUCaceh(): def __init__(self, size=5): ''' 默认队列的长度为5 使用列表来维护
-
Python代码块及缓存机制原理详解
这篇文章主要介绍了Python代码块及缓存机制原理详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 1.相同的字符串在Python中地址相同 s1 = 'panda' s2 = 'panda' print(s1 == s2) #True print(id(s1) == id (s2)) #True 2.代码块: 所有的代码都需要依赖代码块执行. 一个模块,一个函数,一个类,一个文件等都是一个代码块 交互式命令中, 一行就是一个代码块
-
Python使用LRU缓存策略进行缓存的方法步骤
目录 一.Python 缓存 ① 缓存作用 ② 使用 Python 字典实现缓存 二.深入理解 LRU 算法 ① 查看 LRU 缓存的特点 ② 查看 LRU 缓存的结构 三.使用 lru_cache 装饰器 ① @lru_cache 装饰器的实现原理 ② 斐波拉契数列 ③ 使用 @lru_cache 缓存输出结果 ④ 限制 @lru_cache 装饰器大小 ⑤ 使用 @lru_cache 实现 LRU 缓存 ⑥ 解包 @lru_cache 的功能 四.添加缓存过期 五.@lru_cache 装饰
-
详解高性能缓存Caffeine原理及实战
目录 一.简介 二.Caffeine 原理 2.1.淘汰算法 2.1.1.常见算法 2.1.2.W-TinyLFU 算法 2.2.高性能读写 2.2.1.读缓冲 2.2.2.写缓冲 三.Caffeine 实战 3.1.配置参数 3.2.项目实战 四.总结 一.简介 下面是Caffeine 官方测试报告. 由上面三幅图可见:不管在并发读.并发写还是并发读写的场景下,Caffeine 的性能都大幅领先于其他本地开源缓存组件. 本文先介绍 Caffeine 实现原理,再讲解如何在项目中使用 Caffe
-
python 如何引入协程和原理分析
相关概念 并发:指一个时间段内,有几个程序在同一个cpu上运行,但是任意时刻只有一个程序在cpu上运行.比如说在一秒内cpu切换了100个进程,就可以认为cpu的并发是100. 并行:值任意时刻点上,有多个程序同时运行在cpu上,可以理解为多个cpu,每个cpu独立运行自己程序,互不干扰.并行数量和cpu数量是一致的. 我们平时常说的高并发而不是高并行,是因为cpu的数量是有限的,不可以增加. 形象的理解:cpu对应一个人,程序对应喝茶,人要喝茶需要四个步骤(可以对应程序需要开启四个线程):1烧
-
关于Android的 DiskLruCache磁盘缓存机制原理
目录 一.为什么用DiskLruCache 1.LruCache和DiskLruCache 2.为何使用DiskLruCache 二.DiskLruCache使用 1.添加依赖 2.创建DiskLruCache对象 3.添加 / 获取 缓存(一对一) 4.添加 / 获取 缓存(一对多) 三.源码分析 1.open() 2.rebuildJournal() 3.readJournal() 4.get() 5.validateKey 6.trimTOSize() 7.journalRebuildRe
-
Android RecyclerView缓存复用原理解析
目录 一.牵出缓存 1.缓存还在屏幕内的ViewHolder——Scrap缓存 mAttachedScrap mChangeScrap 用一个例子说明 2.缓存屏幕之外的ViewHolder——CacheView 3.mViewCacheExtension 4.RecycledViewPool 二.到底是四级缓存还是三级缓存 一.牵出缓存 都有哪些缓存,作用是什么,为什么这么设计 1.缓存还在屏幕内的ViewHolder——Scrap缓存 Scrap是RecyclerView中最轻量的缓存,它不
-
Python爬虫DNS解析缓存方法实例分析
本文实例讲述了Python爬虫DNS解析缓存方法.分享给大家供大家参考,具体如下: 前言: 这是Python爬虫中DNS解析缓存模块中的核心代码,是去年的代码了,现在放出来 有兴趣的可以看一下. 一般一个域名的DNS解析时间在10~60毫秒之间,这看起来是微不足道,但是对于大型一点的爬虫而言这就不容忽视了.例如我们要爬新浪微博,同个域名下的请求有1千万(这已经不算多的了),那么耗时在10~60万秒之间,一天才86400秒.也就是说单DNS解析这一项就用了好几天时间,此时加上DNS解析缓存,效果就
-
Python实现希尔排序算法的原理与用法实例分析
本文实例讲述了Python实现希尔排序算法的原理与用法.分享给大家供大家参考,具体如下: 希尔排序(Shell Sort)是插入排序的一种.也称缩小增量排序,是直接插入排序算法的一种更高效的改进版本. 希尔排序的基本思想是:先将整个待排元素序列分割成若干个子序列(由相隔某个"增量"的元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序(增量足够小)时,再对全体元素进行一次直接插入排序.因为直接插入排序在元素基本有序的情况下(接近最好情况),效率是很高
-
深入理解Python 关于supper 的 用法和原理
一.前言 Python 面向对象中有继承这个概念,初学时感觉很牛逼,里面也有个super类,经常见到,最近做一些题才算是理解了.特地记录分享给后来研究的小伙伴,毕竟现在小学生都开始学了(滑稽脸) 二.代码 直接上干货,能把下面一个问题全答对,后面就不用看了. class A(): def go(self): print ("go A go!") def stop(self): print ("stop A stop!") def pause(self): raise
随机推荐
- 如何读取文本文件的内容?
- 详解AngularJS验证、过滤器、指令
- Firefox中autocomplete="off" 设置不起作用Bug的解决方法
- vs2008 安装失败的总结与分享
- 基于scrapy实现的简单蜘蛛采集程序
- 上一篇,下一篇过程代码
- jquery实现在页面加载完毕后获取图片高度或宽度
- FtpHelper实现ftp服务器文件读写操作(C#)
- React中上传图片到七牛的示例代码
- jQuery stop()用法实例详解
- js 数组实现一个类似ruby的迭代器
- Java实现给网站上传图片盖章的方法
- jquery实现预览提交的表单代码分享
- svg动画之动态描边效果
- js实现的的 文字自动'到google search框
- C#中动态数组用法实例
- 详解Android中使用Notification实现进度通知栏(示例三)
- 通过JS运行机制的角度说说作用域
- 详解angular2 控制视图的封装模式
- Pycharm简单使用教程(入门小结)