设计一个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
相关推荐
aiguangyuan2 分钟前
词向量的艺术:从Word2Vec到GloVe的完整实践指南
人工智能·python·nlp
嫂子的姐夫5 分钟前
24-MD5:红人点集登录+凡客网登录
爬虫·python·逆向·小白逆向练手
不绝1919 分钟前
MonoBehavior/GameObject/Time/Transform/位移/角度旋转/缩放看向/坐标转换
开发语言·python
曲幽17 分钟前
FastAPI实战:Redis缓存与分布式锁的深度解析
redis·python·cache·fastapi·web·lock
小码过河.25 分钟前
17装饰器模式
开发语言·python·装饰器模式
gf132111133 分钟前
python_生成RPA运行数据报告
windows·python·rpa
嫂子开门我是_我哥34 分钟前
第八节:条件判断与循环:解锁Python的逻辑控制能力
开发语言·python
2301_8059629336 分钟前
树莓派的一些问题记录-1:usbboot仓库
python·gitee
深蓝电商API40 分钟前
Selenium 动作链 ActionChains 高级用法
爬虫·python·selenium
喵手1 小时前
Python爬虫零基础入门【第八章:项目实战演练·第2节】项目 2:信息聚合站 Demo(列表+详情+增量+质量报告)!
爬虫·python·爬虫实战·python爬虫工程化实战·零基础python爬虫教学·爬虫项目演练·信息聚合站