红色的缓存:dict的实现
在Python领域中,我们经常会听到缓存的概念。缓存是指将一些经过计算的结果保存在内存中,以便在下次需要同样结果时可以更为快速地获取,从而提高程序的效率。
在Python中,最常用的缓存数据结构之一就是dict(字典)。在这里,我们将介绍如何使用dict来实现一个红色的缓存(LRU Cache),以便更好地管理内存。
红色的缓存是指当缓存达到最大容量时,会将最近最少使用(Least Recently Used)的缓存数据删除,从而保持缓存空间的利用率。我们可以通过dict和双向链表来实现红色的缓存。具体实现分以下步骤:
1. 创建一个类LRU_Cache,该类包含两个属性:dict缓存和双向链表。
class Node:
def __init__(self, key=None, value=None):
self.key = key
self.value = value
self.prev = None
self.next = None
class LRU_Cache:
def __init__(self, capacity):
self.capacity = capacity
self.hash_map = {}
self.head = Node(None, None)
self.tl = Node(None, None)
self.head.next = self.tl
self.tl.prev = self.head
self.count = 0
2. 创建两个辅助方法:add_node和delete_node。add_node是将一个节点插入到双向链表的头部,delete_node是将一个节点从双向链表中删除。```pythondef add_node(self, node):node.prev = self.headnode.next = self.head.nextself.head.next.prev = nodeself.head.next = nodedef delete_node(self, node):node.prev.next = node.nextnode.next.prev = node.prev
3. 当从缓存中获取数据时,我们需要更新双向链表的顺序,以便将该节点移至链表的头部。然后,返回查询到的值。
def get(self, key):
if key in self.hash_map:
node = self.hash_map[key]

self.delete_node(node)
self.add_node(node)
return node.value
4. 当向缓存中添加数据时,我们同样需要更新双向链表。如果缓存已满,则需要将最近最少使用的节点从缓存中删除。```pythondef put(self, key, value):if key in self.hash_map:node = self.hash_map[key]node.value = valueself.delete_node(node)self.add_node(node)else:if self.count == self.capacity:node = self.tl.prevself.delete_node(node)del self.hash_map[node.key]self.count -= 1node = Node(key, value)self.add_node(node)self.hash_map[key] = nodeself.count += 1
我们可以通过以下代码测试我们的LRU_Cache类:
cache = LRU_Cache(2)
cache.put(1, 1)
cache.put(2, 2)
print(cache.get(1)) # 1
cache.put(3, 3)
print(cache.get(2)) # -1
cache.put(4, 4)
print(cache.get(1)) # -1
print(cache.get(3)) # 3
print(cache.get(4)) # 4
这段测试代码将缓存的最大容量设为2。我们向缓存中添加两个节点1和2。然后,我们从缓存中查询节点1,得到返回值1。接着,我们向缓存中添加节点3,并且此时容量已经达到最大值2,因此我们需要将最近最少使用的节点2从缓存中删除。接下来,我们查询节点2,得到返回值-1。接着,我们查询节点1,得到返回值-1,因为节点1已经被删除了。我们查询节点3和节点4,分别得到返回值3和4。在实际的应用程序中,缓存可以大大提高程序的效率,同时还可以减少计算机的资源使用率。使用dict和双向链表可以方便地实现缓存,以便更好地管理内存和提高程序的性能。
香港服务器首选树叶云,2H2G首月10元开通。树叶云(shuyeidc.com)提供简单好用,价格厚道的香港/美国云 服务器 和独立服务器。IDC+ISP+ICP资质。ARIN和APNIC会员。成熟技术团队15年行业经验。
redis集合和有序集合的区别
如果是使用的del命令.是会释放内存的.c//....187 void delCommand(redisClient *c)//....191 if (dbDelete(c- > db,c- > argv[j])) {//....131 int dbDelete(redisDb *db, robj *key) {//...140 return dictDelete(db- > dict,key- > ptr) == DICT_OK;
scrapy使用redis的时候,redis需要进行一些设置吗
1.使用两台机器,一台是win10,一台是centos7,分别在两台机器上部署scrapy来进行分布式抓取一个网站7的ip地址为192.168.1.112,用来作为redis的master端,win10的机器作为的爬虫运行时会把提取到的url封装成request放到redis中的数据库:“dmoz:requests”,并且从该数据库中提取request后下载网页,再把网页的内容存放到redis的另一个数据库中“dmoz:items”从master的redis中取出待抓取的request,下载完网页之后就把网页的内容发送回master的redis5.重复上面的3和4,直到master的redis中的“dmoz:requests”数据库为空,再把master的redis中的“dmoz:items”数据库写入到mongodb中里的reids还有一个数据“dmoz:dupefilter”是用来存储抓取过的url的指纹(使用哈希函数将url运算后的结果),是防止重复抓取的!
输入法不见了,怎样找到,语言栏设置是灰色的?
如果第1项语言栏为灰色,先进行第2项设置,第1项就可以设置了)。 任务栏系统托盘区的输入法图标不见了,点击运行输入 回车即可。 任务栏没有了输入法,解决方法: 1、打开控制面板/日期、时间、语言和区域设置/区域和语言选项/语言/详细信息/语言栏,在其中勾选“在任务栏中显示其它语言栏图标”然后按确定和应用(如果第1项语言栏为灰色,先进行第2项设置,第1项就可以设置了)。 2、如果故障依旧:打开控制面板/日期、时间、语言和区域设置/区域和语言选项/语言/详细信息/高级/在打开的对话框中,将“关闭高级文字服务”前的勾去掉,然后按应用和确定。 3、如果故障依旧,运行输入regedit打开注册表定位,[HKEY_CURRENT_USER\Software\Microsoft\windows\CurrentVersion\Run]在右窗格点击鼠标右键,选择新建一个字符串值,在名称里面输入回车,双击在数值数据中输入C:\Windows\System32\回车,重启电脑即可。 4、如果故障依旧,建议你用系统自带的系统还原,还原到你没有发生这次故障的时候进行修复。 5、如果故障依旧,用系统安装盘修复系统。 运行输入CMD回车打开命令提示符输入SFC /SCANNOW按回车键(SFC和/有一个空格),插入系统安装盘,系统会自动将硬盘中的系统文件与系统盘中的文件比较并进行修复。 如果输入法只能输入英文或指定语言。 开始运行输入回车打开组策略,在左侧选用户配置/管理模板/控制面板/区域和语言选项/在右侧选“限制Windows菜单和对话框语言的选项”双击它,在打开的对话框中选择“未配置”然后按应用确定,重启电脑即可。 语言栏不能正常切换 可能是你的操作时间稍长,缓存已满,会造成语言栏不能正常切换、右键无反应、文件夹内容出现错乱等等故障,一般通过重启就可解决问题。 出现这种现象的原因还有: 1、使用QQ这个软件与系统不兼容引起的,卸载,在重新下载安装。 2、打开程序太多互相干扰,关闭一切程序(不要打开过多的网页),包括杀毒软件的监控,不要幕后杀毒。 3、操作一会缓存已满(包括打开网页过多),也会出现各种奇怪的故障,一般重启即可恢复。 出现这种故障,可能是注册表受损造成的,解决办法如下: 1、开机按F8进入安全模式后在退出,在进入正常模式(修复注册表)。 2、如果故障依旧,请你用系统自带的系统还原,还原到你没有出现这次故障的时候修复(如果正常模式恢复失败,请开机按F8进入到安全模式中使用系统还原)。 3、如果故障依旧,使用系统盘修复,打开命令提示符输入SFC /SCANNOW 回车(SFC和/之间有一个空格),插入原装系统盘修复系统,系统会自动对比修复的。
发表评论