9

比如像这样,有必要用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()

文档中,它说key_prefix的默认值为request.path cache_key.:,是什么cache_key意思,我该如何使用它?做什么key_prefix

4

1 回答 1

18

首先request.path是 . 之后的所有内容(参数除外)script_root。例如:

  1. 对于类似的 url http://127.0.0.1:5000/users/login/,请求数据是:

    request.path is: /users/login/
    
  2. 对于上面链接示例中的 url http://www.example.com/myapplication/page.html?x=y,请求数据为:

    request.path is: /page.html
    

Q. cache_key 是什么意思,如何使用?

cache_key是用于访问特定缓存值的键。如您所知,缓存是键值存储。

在 Flask-Cache 中,cache_key它是由扩展生成的,我们不应该自己使用它。


问:key_prefix 有什么作用?

key_prefix用于生成cache_key缓存值。查看make_cache_key源代码以了解它是如何完成的。


Q. 有必要使用key_prefix吗?

假设您get_all_comments从 2 个不同的视图函数调用,例如manage()view()。而且您没有指定key_prefix, 缓存get_all_comments时使用@cached.

第一次通过输出查看帖子view时,会使用默认键缓存,例如:or ,或任何值, where is 。get_all_commentsview/viewview/module/viewview/%s%srequest.path

接下来,当您通过管理帖子manage时,get_all_comments不会从缓存中读取输出,因为从缓存cache_key中获取数据的应用程序已更改为view/manage并且不是旧的view/view,因为 request.path 现在已更改。

这里缓存的全部目的get_all_comments是尽可能从缓存中获取数据,而不是从数据库中获取数据,但是由于视图函数之间的键已经更改,因此实际上两次都从数据库本身检索数据。

但是,如果您指定了key_prefixlike all_comments,那么第一次从 db 中检索数据,下一次cache_key仍然all_comments找到值,并且从缓存而不是 db 访问数据。

因此,当您遇到上述情况时,使用 a 显然更好key_prefix,在其他情况下,当始终从单个路径/视图函数调用该函数时,可以使用默认值。


注意:cache_key 是为每个请求生成/计算的,请参阅源代码

cache_key = decorated_function.make_cache_key(*args, **kwargs)
于 2013-01-09T11:43:20.313 回答