MPTT 树结构的 Redis 缓存失效策略
为 Django-MPTT 管理的树状数据设计精确的缓存失效方案,避免全表缓存清除。 · 难度:入门 · +10XP
树缓存失效
MPTT 树中移动或删除节点时,需更新所有子孙节点的 lft/rgt 值,导致大量缓存失效。本教程将展示如何利用 Redis 的 sorted set 存储节点路径深度,结合 Django 信号只为受影响分支生成失效键。你将学习缓存键模式设计(如 'tree:{tree_id}:{node_id}:children')以及使用 pipeline 批量删除。
from django.core.cache import cache
from django.db.models.signals import post_save
@receiver(post_save, sender=Category)
def invalidate_category_cache(sender, instance, **kwargs):
# 失效当前节点及其父链
parent = instance.parent
keys = [f'cat_tree:{instance.tree_id}:root']
while parent:
keys.append(f'cat_tree:{parent.tree_id}:{parent.pk}')
parent = parent.parent
cache.delete_many(keys)