You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何模拟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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 16:52:40