`key_prefix`参数在Flask-Cache中有什么作用?

10
例如像这样,需要使用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有什么作用?
1个回答

20

首先,request.path 是指除了 script_root 后的所有内容(不包括参数)。例如:

  1. 对于这样的 URL: http://127.0.0.1:5000/users/login/,请求数据为:

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

  • request.path is: /page.html
    

    1. Q. cache_key 是什么意思,我该如何使用它?

      cache_key 是用于访问特定缓存值的键。像您所知道的那样,缓存是一个键值存储。

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


      Q. key_prefix 是什么作用?

      key_prefix 用于生成缓存值的 cache_key。查看 make_cache_key 源代码可以了解其工作原理。


      Q. 必须使用 key_prefix 吗?

      假设您从两个不同的视图函数中调用了 get_all_comments,即 manage()view()。而且您没有指定一个 key_prefix,同时使用 @cached 缓存 get_all_comments

      第一次通过 view 查看帖子时,get_all_comments 的输出与默认键一起缓存,例如:view/viewview/module/view,或者 view/%s 的值为 request.path

      接下来,当您通过 manage 管理帖子时,get_all_comments 的输出不会从缓存中读取,因为用于从缓存中获取数据的 cache_key 已更改为 view/manage,而不是旧的 view/view,因为请求路径已经发生了变化。

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

      但是,如果您指定了类似 all_commentskey_prefix,则第一次从数据库中检索数据,而下一次 cache_key 仍然是 all_comments,并且可以从缓存中访问数据,而不是从数据库中访问数据。

      所以,当您有像上面这样的情况时,明显最好使用 key_prefix,在其他情况下,如果函数始终从单个路径/视图函数调用,则可以使用默认值。


      注意:每个请求都会生成/计算缓存键,请看源代码:source

    cache_key = decorated_function.make_cache_key(*args, **kwargs)
    

    2
    好答案!只想补充一点,prefix_key也可以是一个可调用函数,其返回值将用作cache_key。所以我猜它可以“滥用”来传递您自己的make_cache_key函数。在这里查看我的示例https://dev59.com/jmox5IYBdhLWcg3wIQ5o#14264116 - Smoe
    @Smoe 没错,你说得对,if callable(key_prefix): cache_key = key_prefix() - bool.dev

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接