【问题标题】:What does `key_prefix` do for flask-cache?`key_prefix` 对烧瓶缓存有什么作用?
【发布时间】:2013-01-09 05:47:33
【问题描述】:

比如这样,是不是一定要用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 是做什么的?

【问题讨论】:

    标签: python caching flask flask-extensions


    【解决方案1】:

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

    1. 对于像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
      

    问。 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()。而且你没有指定key_prefix,同时缓存get_all_comments@cached

    第一次通过view查看帖子时,get_all_comments 的输出会被缓存为 default key,例如:view/viewview/module/view,或任何 @987654348 的值@ 是,其中%srequest.path

    接下来,当您通过manage管理帖子时,不会从缓存中读取get_all_comments 输出,因为用于从缓存中获取数据的cache_key 已更改为@987654354 @ 而不是旧的view/view,因为request.path 现在已经改变了。

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

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

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


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

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

    【讨论】:

    猜你喜欢
    • 2016-01-03
    • 2020-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多