当相关的黑名单表更新时,防止Johnny-Cache使列入白名单的表缓存无效

时间:2013-09-20 13:26:46

标签: django

在我的Django应用程序中,我有一组不经常更新的模型,我正在使用johnny-cache进行缓存,另一个是经常更新的模型(称为Page),我已经为其实现了单独的缓存制度。

一些列入白名单的模型与Page具有外键关系。我知道在更新Page时哪些白名单模型缓存应该无效,所以我已经实现了一组信号处理程序,以便在Page上执行特定操作后显式地使缓存无效。

但是,我注意到 johnny-cache 会在每次更新操作后自动使任何具有Page外键关系的模型缓存失效。这个方法(在johhny.cache中)似乎是问题所在:

def invalidate(self, instance, **kwargs):
    if self._patched:
        table = resolve_table(instance)
        if not disallowed_table(table):
            self.keyhandler.invalidate_table(table)

        tables = set()
        tables.add(table)

        try:
             instance._meta._related_objects_cache
        except AttributeError:
             instance._meta._fill_related_objects_cache()

        for obj in instance._meta._related_objects_cache.keys():
            obj_table = obj.model._meta.db_table
            if obj_table not in tables:
                tables.add(obj_table)
                if not disallowed_table(obj_table):
                    self.keyhandler.invalidate_table(obj_table)

最后一部分循环遍历与正在更新的表相关的所有表,并在列入白名单的任何表上调用self.keyhandler.invalidate_table(obj_table)

我可以使用哪些配置告诉johnny-cache忽略对非白名单表的所有更改?或者我必须改变这样的功能:

         ...
         if not disallowed_table(table):
            self.keyhandler.invalidate_table(table)
         else:
            return
         ...

这看起来有效但丑陋?

1 个答案:

答案 0 :(得分:0)

您可以查看缓存解决方案,该解决方案具有更精细的缓存失效,例如cacheopscache-machine