lru_cache:缓存结果之前,先确定数据何时过期
给一个读取配置的函数加缓存可以减少重复工作,却也可能让修改后的配置一直不可见。缓存正确性首先取决于结果是否只由键决定。
问题从哪里出现
给一个读取配置的函数加缓存可以减少重复工作,却也可能让修改后的配置一直不可见。缓存正确性首先取决于结果是否只由键决定。
理解核心机制
lru_cache 按可哈希参数缓存返回值,并通过 maxsize 限制条目数。它没有内置时间过期机制;版本号加入键或显式 cache_clear,可以表达失效条件。
动手做一个小实验
Python 3.11 或更新版本,仅使用标准库;将示例保存为 demo.py 后执行 python3 demo.py。
from functools import lru_cache
calls = []
@lru_cache(maxsize=16)
def square(version, value):
calls.append((version, value))
return value * value
assert square("v1", 4) == square("v1", 4) == 16
assert len(calls) == 1
square("v2", 4)
assert len(calls) == 2
print(square.cache_info())适用边界与常见误区
缓存可变返回值会把同一对象交给多个调用方。线程安全的缓存管理也不保证同一个缺失键的计算只执行一次。
继续练习
把返回值改成列表,修改第一次取得的结果,再读取缓存;据此决定是否返回不可变值或防御性副本。