递归地使Django缓存中的路径无效

kni*_*nap 6 django caching path invalidation

我正在从Django缓存中删除单个路径,如下所示:

from models                   import Graph
from django.http              import HttpRequest
from django.utils.cache       import get_cache_key
from django.db.models.signals import post_save
from django.core.cache        import cache

def expire_page(path):
    request      = HttpRequest()
    request.path = path
    key          = get_cache_key(request)
    if cache.has_key(key):   
        cache.delete(key)

def invalidate_cache(sender, instance, **kwargs):
    expire_page(instance.get_absolute_url())

post_save.connect(invalidate_cache, sender = Graph)
Run Code Online (Sandbox Code Playgroud)

这有效 - 但有没有办法递归删除?我的路径看起来像这样:

/graph/123
/graph/123/2009-08-01/2009-10-21
Run Code Online (Sandbox Code Playgroud)

只要保存了ID为"123"的图形,就需要使两个路径的缓存无效.可以这样做吗?

小智 10

您可能想要考虑使用分代缓存策略,它似乎适合您要完成的任务.在您提供的代码中,您将为每个绝对URL存储"代"号.因此,例如,您将初始化"/ graph/123"以生成一代,然后其缓存键将变为类似"/ GENERATION/1/graph/123".如果要使该绝对URL的缓存失效,则增加其生成值(在本例中为2).这样,下次有人去查找"/ graph/123"时,缓存键变为"/ GENERATION/2/graph/123".这也解决了所有子页面到期的问题,因为它们应该引用与"/ graph/123"相同的缓存键.

一开始理解它有点棘手,但它是一个非常优雅的缓存策略,如果正确完成意味着你永远不必从缓存中删除任何东西.有关更多信息,这里是关于代际缓存的演示文稿,它适用于Rails,但概念是相同的,无论语言如何.