【问题标题】:How to make invalidating Beaker cache work?如何使无效的烧杯缓存起作用?
【发布时间】:2011-01-26 19:17:00
【问题描述】:

我有一个用烧杯缓存装饰器装饰的函数。该函数位于一个模块中,从该模块中导入主应用程序。

from caching import cache, my_cached_function

现在,我在一个函数中使用了修饰函数:

def index():
    data = my_cached_function() # no args

在另一个函数中,我尝试使缓存无效:

def new_item():
    cache.invalidate(my_cached_function, 'namespace')

由于烧杯缓存配置了'cache.type': 'memory',我也试过了:

def new_item():
    cache.invalidate(my_cached_function, 'namespace', type='memory')

我在这里做错了什么?

注意事项

在典型情况下,我大部分时间都会调用 index()。每当调用 new_item() 时,我都需要清除缓存,以便 index() 调用将考虑 new_item() 函数创建的新项目。

有问题的应用程序是一个运行在 Bottle 框架之上的 Web 应用程序。

【问题讨论】:

    标签: python caching bottle beaker


    【解决方案1】:

    您需要在调用my_cached_function 之前使缓存无效。有关示例,请参见 beaker.cache.CacheManager documentation

    【讨论】:

    • 理论上在my_cached_function之前调用。当用户创建一个新项目时,会调用 new_item() 函数,该函数应该使缓存无效。然后,他访问了调用修饰函数的索引页。索引页面应该显示项目列表包括新项目,但事实并非如此。
    • 哦,还有一个注意事项。即使没有失效,缓存也可以工作。我只想强制失效。
    • 不要使new_item中的缓存失效,而是尝试在会话中将should_invalidate_item_cache之类的键设置为True,并在index中,如果该值为True则失效。 (这只是猜测,未经测试。)
    • 嗯,是的,这听起来有点可能。你看这个应用是无状态的,所以我没有任何会话机制。如果我理解正确,失效必须发生在同一范围内?
    • 这是我的猜测,但我实际上并没有使用 Beaker 的缓存。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-18
    • 1970-01-01
    相关资源
    最近更新 更多