我有一个简单的实现,它使用包装器lru_cache围绕从远程数据库获取数据的函数。我想知道结果是否可能是“过时的”(即是从缓存中还是从数据库中获取的)。我该如何解决?
代码很简单,只是:
@lru_cache(maxsize=2048)
def fetch_cached_data(query, *args, **kwargs):
return fetch_data(query, *args, **kwargs)
答案 0 :(得分:1)
一个不好的解决方案(仅在单线程程序中有效)可能是监视函数的cache_info
来查看统计信息是否正在更改:
hits = f.cache_info().hits
result = f(some_arg)
if f.cache_info().hits > hits:
# this result was retrieved from cache
...
更好的解决方案可能是更多地考虑您认为过时的东西...所有值最终都来自数据库...是什么使您在过去的函数调用中查询过时...自上次查询以来的时间,返回行上的版本戳等
答案 1 :(得分:1)
带有ring
的解决方案,仅在单线程程序中有效。
import ring
@ring.lru(maxsize=2048)
def fetch_cached_data(query, *args, **kwargs):
return query
if __name__ == '__main__':
is_cached = fetch_cached_data.has('query')
data = fetch_cached_data('query')
print(is_cached, data)
is_cached = fetch_cached_data.has('query')
data = fetch_cached_data('query')
print(is_cached, data)
然后输出为:
False query
True query