例如,是否需要使用key_prefix
@cache.cached(timeout=50, key_prefix='all_comments')
def get_all_comments():
comments = do_serious_dbio()
return [x.author for x in comments]
cached_comments = get_all_comments()在document中,它说key_prefix的默认值是request.path cache_key.:,cache_key是什么意思,我如何使用它?key_prefix做了什么?
发布于 2013-01-09 19:43:20
首先,request.path是script_root之后的所有东西(除了params)。例如:
对于像http://127.0.0.1:5000/users/login/这样的url,请求数据为:
request.path是: /users/login/
http://www.example.com/myapplication/page.html?x=y,请求数据是:request.path是: /page.html
问: cache_key是什么意思,我如何使用它?
cache_key是用于访问特定缓存值的键。正如您所知道的,缓存是一个键值存储。
在Flask-Cache中,cache_key是由扩展生成的,我们不应该自己使用它。
问: key_prefix是做什么的?
key_prefix用于为缓存值生成cache_key。请参阅make_cache_key source以了解具体是如何完成的。
问:有必要使用key_prefix吗?
假设您正在从两个不同的视图函数调用get_all_comments,比如manage()和view()。在使用@cached缓存get_all_comments时,您不需要指定key_prefix。
第一次通过view查看帖子时,get_all_comments输出用default key缓存,如:view/view或view/module/view,或者view/%s的值是什么,其中%s是request.path。
接下来,当您通过manage管理post时,不会从缓存中读取get_all_comments输出,因为应用于从缓存获取数据的cache_key已更改为view/manage,而不是旧的view/view,因为request.path现在已更改。
这里缓存get_all_comments的全部目的是为了尽可能地从缓存中获取数据,而不是从数据库中获取数据,但是由于键在视图函数之间发生了变化,所以实际上两次都是从数据库本身中检索数据。
但是,如果您指定了像all_comments这样的key_prefix,那么第一次从db检索数据,下一次cache_key仍然是all_comments,并且找到值,并且从缓存而不是db访问数据。
因此,当你遇到像上面这样的情况时,使用key_prefix显然更好,在其他情况下,当函数总是从单个路径/视图函数调用时,则可以使用默认函数。
注意:每次请求都会生成/计算cache_key,请参阅source
cache_key = decorated_function.make_cache_key(*args, **kwargs)https://stackoverflow.com/questions/14228985
复制相似问题