什么`key_prefix`为flask-cache做什么?

Han*_*Sun 5 python caching flask flask-extensions

比如这样,是否有必要使用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()
Run Code Online (Sandbox Code Playgroud)

文档中,它表示key_prefix默认值是request.path cache_key.:什么cache_key意思,我该如何使用它?怎么key_prefix办?

boo*_*dev 13

首先request.path是你之后的一切(除了params)script_root.例如:

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

    request.path is: /users/login/
    
    Run Code Online (Sandbox Code Playgroud)
  2. 对于上面链接示例中的网址http://www.example.com/myapplication/page.html?x=y,请求数据为:

    request.path is: /page.html
    
    Run Code Online (Sandbox Code Playgroud)

问:cache_key是什么意思,我该如何使用它?

cache_key是用来访问特定的缓存值的关键.如您所知,缓存是键值存储.

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


问:key_prefix有什么作用?

key_prefix用于生成cache_key缓存值.请参阅make_cache_keysource以了解它是如何完成的.


问:是否有必要使用key_prefix?

假设您正在get_all_comments使用两种不同的视图函数调用,比如说manage()view().并且key_prefix在缓存get_all_comments时不指定a @cached.

您第一次查看后通过viewget_all_comments输出缓存与默认密钥,如:view/view或者view/module/view,或任何价值view/%s的,这里%srequest.path.

接下来,当您管理发布manage,get_all_comments不会从缓存中读取输出,因为cache_key应用于从缓存中获取数据已更改为view/manage旧的view/view,因为request.path现在已更改.

get_all_comments这里缓存的全部要点是尽可能从缓存中获取数据而不是数据库,但由于密钥在视图函数之间发生了变化,因此数据实际上都是从数据库本身检索的.

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

因此,当您遇到类似上述key_prefix情况时,显然最好使用a ,在其他情况下,当总是从单个路径/视图函数调用该函数时,可以使用默认函数.


注意:为每个请求生成/计算cache_key,请参阅:

cache_key = decorated_function.make_cache_key(*args, **kwargs)
Run Code Online (Sandbox Code Playgroud)

  • 很好的答案!只是想添加,prefix_key也可以是一个可调用的,其返回值将用作cache_key.所以我想可以"滥用"传递你自己的make_cache_key函数.请参阅我的示例http://stackoverflow.com/questions/9413566/flask-cache-memoize-url-query-string-parameters-as-well/14264116#14264116 (2认同)