urllib3中学到的LRU算法
介绍
urllib3._collections.py::RecentlyUserContainer类,是一个线程安全的Dict类容器,用来维护一定数量(maxsize)的Key-Value映射, 当数量超出,会删除最近最少使用的key。该类实际用在PoolManager中存储Session中一定连接数量的连接池,当连接数超出时,会自动删除最早保存的连接,并且查找连接的时间复杂度是O(1)。
原理
其原理是通过有序字典(OrderedDict)保存Key的插入顺序,但Key的数量超出阈值时,删除最早插入的Key
from collections import OrderedDict
from threading import RLock
class RecentlyUserContainer:
def __init__(self, maxsize):
self._maxsize = maxsize
self._container = OrderedDict()
self.lock = RLock()
def __getitem__(self, key):
with self.lock:
# 注意 这里先取出再插入的目的是更新该Key的顺序,即它最近被访问过
item = self._container.pop(key)
self._container[key] = item
return item
def __setitem__(self, key, value):
with self.lock:
self._container[key] = value
if len(self._container) > self._maxsize:
# 驱逐出最早插入的Key
key, _ = self._container.popitem(last=False)
print(f"{key} is evicted")
使用
>>> pool = RecentlyUserContainer(3)
>>> pool["https://www.1.com"] = "conn1"
>>> pool["https://www.2.com"] = "conn2"
>>> pool["https://www.3.com"] = "conn3"
>>> pool["https://www.4.com"] = "conn4"
www.1.com is evicted
>>> pool._container
OrderedDict([('https://www.2.com', 'conn2'),
('https://www.3.com', 'conn3'),
('https://www.4.com', 'conn4')])
urllib3中学到的LRU算法的更多相关文章
- Android图片缓存之Lru算法
前言: 上篇我们总结了Bitmap的处理,同时对比了各种处理的效率以及对内存占用大小.我们得知一个应用如果使用大量图片就会导致OOM(out of memory),那该如何处理才能近可能的降低oom发 ...
- 缓存淘汰算法--LRU算法
1. LRU1.1. 原理 LRU(Least recently used,最近最少使用)算法根据数据的历史访问记录来进行淘汰数据,其核心思想是"如果数据最近被访问过,那么将来被访问的几率也 ...
- 借助LinkedHashMap实现基于LRU算法缓存
一.LRU算法介绍 LRU(Least Recently Used)最近最少使用算法,是用在操作系统中的页面置换算法,因为内存空间是有限的,不可能把所有东西都放进来,所以就必须要有所取舍,我们应该把什 ...
- LinkedHashMap实现LRU算法
LinkedHashMap特别有意思,它不仅仅是在HashMap上增加Entry的双向链接,它更能借助此特性实现保证Iterator迭代按照插入顺序(以insert模式创建LinkedHashMap) ...
- LinkedHashMap 和 LRU算法实现
个人觉得LinkedHashMap 存在的意义就是为了实现 LRU 算法. public class LinkedHashMap<K,V> extends HashMap<K,V&g ...
- 简单LRU算法实现缓存
最简单的LRU算法实现,就是利用jdk的LinkedHashMap,覆写其中的removeEldestEntry(Map.Entry)方法即可,如下所示: java 代码 import java.ut ...
- memached 服务器lru算法
1.LRU是Least Recently Used的缩写,即最近最少使用页面置换算法,是为虚拟页式存储管理服务的.LRU算法的提出,是基于这样一个事实:在前面几条指令中使用频繁的页面很可能在后面的几条 ...
- 用LinkedHashMap实现LRU算法
(在学习操作系统时,要做一份有关LRU和clock算法的实验报告,很多同学都应该是通过数组去实现LRU,可能是对堆栈的使用和链表的使用不是很熟悉吧,在网上查资料时看到了LinkedHashMap,于是 ...
- 近期最久未使用页面淘汰算法———LRU算法(java实现)
请珍惜小编劳动成果,该文章为小编原创,转载请注明出处. LRU算法,即Last Recently Used ---选择最后一次訪问时间距离当前时间最长的一页并淘汰之--即淘汰最长时间没有使用的页 依照 ...
随机推荐
- C++中dynamic_cast与static_cast浅析与实例演示
1. static_cast 1.1 static_cast语法 static_cast< new_type >(expression) 备注:new_type为目标数据类型,expres ...
- HTMLTestRunner.py 文件,已修改完成
""" A TestRunner for use with the Python unit testing framework. It generates a HTML ...
- 将base64Url对应图片保存到本地
上图中的内容就是base64编码之后对应的Url 图中base64,之前的都是用于声明该图片的格式以及它的编码格式 base64,之后的就是该图片对应的数据了 我们只需要把数据转换为字节保存下来即 ...
- odoo里的开发案例
1.模块命名[驼峰命名方法] res开头的是:resources 常见模型:res.users, res.company, res.partner, res.config.setti ...
- Mysql用户、权限、密码管理
一.用户管理 默认:用户root 创建用户: use mysql; create user 'alex'@'192.168.193.200' identified by '123456'; 创建了al ...
- 货币兑换问题(动态规划法)——Python实现
# 动态规划法求解货币兑换问题 # 货币系统有 n 种硬币,面值为 v1,v2,v3...vn,其中 v1=1,使用总值为money的钱与之兑换,求如何使硬币的数目最少,即 x1,x2,x3... ...
- Java大整形BigInteger的用法
基本类型int有32位,范围是:[-2147483648, 2147483647](正负21亿多) 基本类型long有64位,范围是:[-9223372036854775808, 9223372036 ...
- QT: 如何移动和缩放一个无边框窗口
一个QT窗口如下可以做到无边框: Window { id: window //Designer 竟然不支持..., 设计模式时要注意 flags: Qt.FramelessWindowHint wid ...
- JAVA的一般输入输出 和 快速输入输出 (BufferedReader&BufferedWrite)(转载)
1.JAVA的一般输入输出 和 快速输入输出 (BufferedReader&BufferedWrite) 摘要 本文主要介绍快速输入输出, 文中提到了几个IO类,这里推荐使用Buffered ...
- 5、Python断言及常用断言函数总结
Python断言 Python assert 语句,又称断言语句,可以看做是功能缩小版的 if 语句,它用于判断某个表达式的值,如果值为真,则程序可以继续往下执行:反之,Python 解释器会报 As ...