如何模拟LFU缓存并输出请求的HIT/MISS状态且存储结果?
解决方案:子类化LFUCache实现请求状态跟踪与结果存储
你可以通过子类化cachetools.LFUCache,重写__getitem__和__missing__方法来分别捕获缓存命中(HIT)和未命中(MISS)状态,同时用一个列表存储所有请求结果。以下是具体实现:
代码实现
from cachetools import LFUCache class TrackingLFUCache(LFUCache): def __init__(self, maxsize): super().__init__(maxsize) self.results = [] # 存储所有请求状态记录 def __getitem__(self, key): # 调用父类方法获取值,确认缓存命中 value = super().__getitem__(key) # 记录命中状态 self.results.append(f"{key} HIT") return value def __missing__(self, key): # 缓存未命中时触发此方法,记录状态 self.results.append(f"{key} MISS") # 保持父类默认行为:抛出KeyError,由外部处理缓存添加 raise KeyError(key)
使用示例
# 初始化最大容量为2的LFU缓存 cache = TrackingLFUCache(maxsize=2) # 模拟请求流程 try: cache[10] except KeyError: # 未命中后将key加入缓存 cache[10] = "data_10" # 再次请求10,命中 cache[10] try: cache[20] except KeyError: cache[20] = "data_20" # 再次请求10,命中 cache[10] # 输出格式化结果 print(" ".join(cache.results)) # 输出:10 MISS 10 HIT 20 MISS 10 HIT
可选优化:自动处理未命中缓存添加
如果希望未命中时自动将key加入缓存(无需手动捕获KeyError),可以修改__missing__方法:
def __missing__(self, key): self.results.append(f"{key} MISS") # 自定义未命中时的默认值,这里用None示例 default_value = None self[key] = default_value return default_value
这样调用cache[key]时,未命中会自动添加key到缓存,同时记录MISS状态,无需额外处理异常。
内容的提问来源于stack exchange,提问作者user1752873
相关产品推荐
相关产品推荐

