使用cache.get_or_set()缓存Django函数调用的结果

sha*_*ker 2 django caching

这条款工作正常:

if cache.get(cache_name):
    events = cache.get(cache_name)
else:
    events = self.get_google_events()
    cache.set(cache_name, events, 60 * 10)
Run Code Online (Sandbox Code Playgroud)

如果我输入一个print语句get_google_events(),只有在缓存过期时才会打印,如预期的那样.但如果我试图将上述内容缩短到这个:

events = cache.get_or_set(cache_name, self.get_google_events(), 60 * 10)
Run Code Online (Sandbox Code Playgroud)

每次都会触发print语句(即缓存被静默打破).第二种形式不是第一种形式吗?

Dan*_*man 7

一点都不.在调用函数本身之前,Python必须完全计算构成函数参数一部分的表达式.在第二种情况下,这意味着self.get_google_events()始终调用,之后get_or_set可以确定是否从缓存中检索值.

另请注意,您的第一个案例可以稍微提高效率:您现在拥有它的方式,您正在进行两次get不必要的调用.相反,只需制作一个:

events = cache.get(cache_name)
if not events:
    events = self.get_google_events()
    cache.set(cache_name, events, 60 * 10)
Run Code Online (Sandbox Code Playgroud)

  • 我来到这里想知道与这个问题类似的事情。如果我们在每次运行 get_or_set 时都忍不住调用可调用对象,那么使用 get_or_set API 以便它实际进行缓存的预期方法是什么? (3认同)

Mar*_*ode 5

解决方案是不调用该函数(没有())。\n在您的情况下,它是:

\n
events = cache.get_or_set(cache_name, self.get_google_events, 60 * 10)\n
Run Code Online (Sandbox Code Playgroud)\n

您可以使用 django 文档中的示例进行测试

\n
import datetime\nfrom django.core.cache import cache\n\ncache.get_or_set(\'some-timestamp-key\', datetime.datetime.now)\n\n>> datetime.datetime(2014, 12, 11, 0, 15, 49, 457920)\n
Run Code Online (Sandbox Code Playgroud)\n

你通常用datetime.datetime.now()来调用它

\n

查看文档Django\xe2\x80\x99s 缓存框架

\n