使用functools lru_cache,如何确定该函数是否返回了我缓存的数据?

时间:2019-03-18 21:19:14

标签: python lru

我有一个简单的实现,它使用包装器lru_cache围绕从远程数据库获取数据的函数。我想知道结果是否可能是“过时的”(即是从缓存中还是从数据库中获取的)。我该如何解决?

代码很简单,只是:

@lru_cache(maxsize=2048)
def fetch_cached_data(query, *args, **kwargs):
    return fetch_data(query, *args, **kwargs)

2 个答案:

答案 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