清除Django中的特定缓存

时间:2012-01-09 05:48:57

标签: python django memcached django-cache

我正在为django项目使用视图缓存。

它说缓存使用URL作为密钥,所以我想知道如果用户更新/删除对象,如何清除其中一个密钥的缓存。

示例:用户将博客帖子发布到domain.com/post/1234/。如果用户编辑了该帖子,我想通过在末尾添加某种删除缓存命令来删除该URL的缓存版本保存已编辑帖子的视图。

我正在使用:

@cache_page(60 * 60)
def post_page(....):

如果post.id是1234,看起来这可能有用,但不是:

def edit_post(....):
    # stuff that saves the edits
    cache.delete('/post/%s/' % post.id)
    return Http.....

3 个答案:

答案 0 :(得分:16)

来自django cache docs,它表示cache.delete('key')应该足够了。所以,我想到了你可能遇到的两个问题:

  1. 您的导入不正确,请记住您必须从cache模块导入django.core.cache

    from django.core.cache import cache
    
    # ...
    cache.delete('my_url')
    
  2. 您使用的密钥不正确(可能使用完整的网址,包括“domain.com”)。要检查哪个是确切的URL,你可以进入你的shell:

    $ ./manage.py shell
    >>> from django.core.cache import cache
    >>> cache.has_key('/post/1234/')
    # this will return True or False, whether the key was found or not
    # if False, keep trying until you find the correct key ...
    >>> cache.has_key('domain.com/post/1234/') # including domain.com ?
    >>> cache.has_key('www.domain.com/post/1234/') # including www.domain.com ?
    >>> cache.has_key('/post/1234') # without the trailing / ?
    

答案 1 :(得分:0)

I make a function to delete key starting with some text. This help me to delete dynamic keys.

list posts cached

def get_posts(tag, page=1):
    cached_data = cache.get('list_posts_home_tag%s_page%s' % (tag, page))
    if not cached_data:
        cached_data = mycontroller.get_posts(tag, page)
        cache.set('list_posts_home_tag%s_page%s' % (tag, page), cached_data, 60)
    return cached_data

when update any post, call flush_cache

def update(data):
    response = mycontroller.update(data)
    flush_cache('list_posts_home')
    return response

flush_cache to delete any dynamic cache

def flush_cache(text):
    for key in list(cache._cache.keys()):
        if text in key:
            cache.delete(key.replace(':1:', ''))

Do not forget to import cache from django

from django.core.cache import cache

答案 2 :(得分:0)

有一个技巧可以解决这个问题。 cache_page装饰器采用key_prefix的可选参数。例如,当您在单个缓存中有多个站点时,应该使用它。 the docs说的是这样:

CACHE_MIDDLEWARE_KEY_PREFIX –如果使用相同的Django安装在多个站点之间共享缓存,请将其设置为站点名称或该Django实例唯一的其他字符串,以防止按键冲突。如果您不在乎,请使用空字符串。

但是,如果您没有多个站点,则可以这样滥用它:

cache_page(cache_length, key_prefx="20201215")

我使用日期作为前缀,因此如果需要,可以很容易地轮换使用新的失效键。这应该很好用。

但是!请注意,如果您使用此技巧,则某些高速缓存(例如,数据库高速缓存,文件系统高速缓存,可能还有其他)不会清除过期的条目,除非它们被访问。如果使用上面的技巧,您将永远不会再访问高速缓存条目,并且直到您将其清除后,它才会持续存在。可能无关紧要,但值得考虑。