在我的 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
...
哪个看起来有效但丑陋?
您可以查看缓存解决方案,它具有更精细的缓存失效,如缓存操作或缓存计算机。