设计一个LRU(最近最少使用)缓存

约束和假设

  • 我们正在缓存什么?
    我们正在缓存Web Query的结果
  • 我们可以假设输入是有效的,还是需要对其验证?
    假设输入是有效的
  • 我们可以假设它适应内存吗?

编码实现

python 复制代码
class Node(object):
	def __init__(self, results):
		self.results = results
		self.prev = None
		self.next = None

class LinkedList(object):
	del __init__(self):
		self.head = None
		self.tail = None
	
	def move_to_front(self, node): # ...
	def append_to_front(self, node): # ...
	def remove_from_tail(self): # ...

class Cache(obejct):
	def __init__(self, MAX_SIZE):
		self.MAX_SIZE = MAX_SIZE
		self.size = 0
		self.lookup = {}
		self.linked_list = LinkedList()

	def get(self, query)
	'''
		Get the stored query result from the cache
		Accsssing a node updates its position to the front of the LRU list
	'''
	node = self.lookup.get(query)
	if node is None:
		return None
	self.linked_list.move_to_front(node)
	return node.results


	def set(self, resuts, query):
		'''Set the results for the given query key in the cache.
		When updating an entry, updates its position to the front of the LRU list
		If the entry is new and the cache is at capacity, remove the oldest entry before the new entry is added '''
		node = self.lookup.get(query)
		if node is not None:	
			node.results = results
			self.linked_list.move_to_front(node)
		else:
			if self.size == self.MAX_SIZE
				self.lookup.pop(self.linked_list.tail.query, None)
				self.linked_list.remove_from_tail()
			else:
				self.size += 1
			new_node = Node(results)
			self.linked_list.append_to_front(new_node)
			self.lookup[query] = new_node
相关推荐
yufuu9812 分钟前
Python在金融科技(FinTech)中的应用
jvm·数据库·python
电饭叔18 分钟前
GUI by Python 6 一段 gui 代码分析
开发语言·python
OnYoung18 分钟前
持续集成/持续部署(CI/CD) for Python
jvm·数据库·python
2301_8223776518 分钟前
高级爬虫技巧:处理JavaScript渲染(Selenium)
jvm·数据库·python
u01092727119 分钟前
用Python和Twilio构建短信通知系统
jvm·数据库·python
无垠的广袤33 分钟前
【Arduino UNO Q】 物联网IoT应用设计:SoC 温度与智能家居
python·物联网·智能家居·开发板
freepopo35 分钟前
天津商业空间设计:本地团队的美学落地方案 [特殊字符]
大数据·人工智能·python
tudficdew1 小时前
使用Python操作文件和目录(os, pathlib, shutil)
jvm·数据库·python
浒畔居1 小时前
工具、测试与部署
jvm·数据库·python
云和数据.ChenGuang1 小时前
python对接mysql和模型类的故障
数据库·python·mysql·oracle·conda·virtualenv