基于版本号的细粒度缓存失效策略
使用全局版本号与局部版本号组合,精准失效部分缓存而不清空全部。 · 难度:入门 · +10XP
版本化缓存失效方案
常见缓存失效要么全局清空,要么依赖key手动删除。本教程提出一种基于版本号的策略:每个模型或视图设置一个全局版本号(存于redis/cache中),缓存key附带该版本号。当某个模型更新时,递增其全局版本号,所有相关缓存自动失效(因为key变了)。你还可以实现局部版本号(如按用户ID),结合形成组合版本key。教程将演示在post_save信号中更新版本号,以及如何在view中获取当前版本。
from django.core.cache import cache
def get_cached_data(model_name):
version = cache.get(f'{model_name}_version', 1)
cache_key = f'{model_name}_data_v{version}'
data = cache.get(cache_key)
if not data:
data = expensive_query()
cache.set(cache_key, data, 3600)
return data
def invalidate_model_cache(model_name):
cache.incr(f'{model_name}_version')