介绍

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算法的更多相关文章

  1. Android图片缓存之Lru算法

    前言: 上篇我们总结了Bitmap的处理,同时对比了各种处理的效率以及对内存占用大小.我们得知一个应用如果使用大量图片就会导致OOM(out of memory),那该如何处理才能近可能的降低oom发 ...

  2. 缓存淘汰算法--LRU算法

    1. LRU1.1. 原理 LRU(Least recently used,最近最少使用)算法根据数据的历史访问记录来进行淘汰数据,其核心思想是"如果数据最近被访问过,那么将来被访问的几率也 ...

  3. 借助LinkedHashMap实现基于LRU算法缓存

    一.LRU算法介绍 LRU(Least Recently Used)最近最少使用算法,是用在操作系统中的页面置换算法,因为内存空间是有限的,不可能把所有东西都放进来,所以就必须要有所取舍,我们应该把什 ...

  4. LinkedHashMap实现LRU算法

    LinkedHashMap特别有意思,它不仅仅是在HashMap上增加Entry的双向链接,它更能借助此特性实现保证Iterator迭代按照插入顺序(以insert模式创建LinkedHashMap) ...

  5. LinkedHashMap 和 LRU算法实现

    个人觉得LinkedHashMap 存在的意义就是为了实现 LRU 算法. public class LinkedHashMap<K,V> extends HashMap<K,V&g ...

  6. 简单LRU算法实现缓存

    最简单的LRU算法实现,就是利用jdk的LinkedHashMap,覆写其中的removeEldestEntry(Map.Entry)方法即可,如下所示: java 代码 import java.ut ...

  7. memached 服务器lru算法

    1.LRU是Least Recently Used的缩写,即最近最少使用页面置换算法,是为虚拟页式存储管理服务的.LRU算法的提出,是基于这样一个事实:在前面几条指令中使用频繁的页面很可能在后面的几条 ...

  8. 用LinkedHashMap实现LRU算法

    (在学习操作系统时,要做一份有关LRU和clock算法的实验报告,很多同学都应该是通过数组去实现LRU,可能是对堆栈的使用和链表的使用不是很熟悉吧,在网上查资料时看到了LinkedHashMap,于是 ...

  9. 近期最久未使用页面淘汰算法———LRU算法(java实现)

    请珍惜小编劳动成果,该文章为小编原创,转载请注明出处. LRU算法,即Last Recently Used ---选择最后一次訪问时间距离当前时间最长的一页并淘汰之--即淘汰最长时间没有使用的页 依照 ...

随机推荐

  1. pip3 pip 安装包 临时更换镜像地址

    在使用pip3或者pip安装某些第三方包的时候,可能会遇到网络原因导致的安装失败. 可以在安装第三方包的时候临时指定镜像地址. 命令: pip3 install 库名 -i 镜像地址 例如:# pip ...

  2. windows上安装python3里没有pip问题,解决办法!

    安装python3: 1.下载python:https://www.python.org/downloads/ 2.安装:   3.安装完成进cmd里验证,但发现无pip包 所以操作步骤如下: 1.下 ...

  3. C#.NET 国密SM3withSM2签名与验签 和JAVA互通

    C# 基于.NET FRAMEWORK 4.5 JAVA 基于 JDK1.8 一.要点 1.签名算法:SM3withSM2. 2.签名值byte[] 转字符串时,双方要统一,这里是BASE64. 二. ...

  4. Spring Boot Mail通过QQ邮箱发送邮件

    本文将介绍如何在Spring Boot工程完成QQ邮箱配置,实现邮件发送功能. 一.在pom文件中添加依赖 <dependency> <groupId>org.springfr ...

  5. 深入刨析tomcat 之---第6篇 how tomcat works 第5章 容器实现原理

    writedby 张艳涛

  6. 解决IDEA右侧maven不显示方法

    解决IDEA右侧maven不显示方法 Ctrl+shift+A --> maven--> add maven projects -->选择对应的pom.xml

  7. SAS启动时自动执行代码

    有时候我们希望SAS启动时自动执行已经编写好的程序,可以按照以下方法实现: 首先正常打开SAS,编写我们想要让SAS启动时自动执行的代码,例如获取桌面文件夹路径,以便在其他程序中引用这个路径. pro ...

  8. 大数据学习(06)——Ozone介绍

    前面几篇文章把Hadoop常用的模块都学习了,剩下一个新模块Ozone,截止到今天最新版本是0.5.0Beta,还没出正式版.好在官方网站有文档,还是中文版的,但是中文版资料没有翻译完整,我试着把它都 ...

  9. getRawX、getRawY与getX、getY、getScrollX、getScrollY,getTop,getLeft区别

    这篇文章写的不错,Mark一下 http://blog.csdn.net/sinat_29912455/article/details/51073537

  10. ssrf解题记录

    ssrf解题记录 最近工作需要做一些Web的代码审计,而我Web方面还比较薄弱,决定通过一些ctf的题目打打审计基础,练练思维,在博客上准备开几个专题专门记录刷题的过程. pwn题最近做的也很少,也要 ...