基于表级哈希的查询缓存自动失效策略
实现一个细粒度的缓存失效系统,通过监控数据库表变更事件计算哈希,自动使依赖于该表的缓存键失效,无需手动清除或设置过期时间。 · 难度:入门 · +10XP
哈希驱动的失效
Django缓存常见问题是缓存雪崩或数据不一致。本教程利用django-signals的post_save/post_delete,监听模型变化后更新一个全局哈希表(存储在Redis中),键为表名,值为数据版本哈希值。每个缓存查询在存储时附带所涉及表的哈希列表,读取时对比当前哈希与存储时的哈希是否一致,若不一致则自动刷新缓存。这样即使用于手动编辑数据库,下次请求也能自动发现不一致并重新缓存。
# cache/invalidation.py
from django.core.cache import cache
from django.db.models.signals import post_save, post_delete
from django.dispatch import receiver
from hashlib import md5
def refresh_table_hash(sender, **kwargs):
table_name = sender._meta.db_table
current_hash = md5(str(time.time()).encode()).hexdigest()[:8]
cache.set(f'table_hash:{table_name}', current_hash, 3600)
# connect signals
for model in all_models:
post_save.connect(refresh_table_hash, sender=model)
post_delete.connect(refresh_table_hash, sender=model)