Django设置timeout为None仍无法持久化缓存数组问题求解
Django缓存TIMEOUT设为None仍丢失数据的原因及解决方案
本地内存缓存(LocMemCache)丢失的根本原因
- LocMemCache是进程级独立缓存,每个Django工作进程都会维护自己独有的内存缓存副本,不管是重启应用、还是多进程部署(比如uWSGI/Gunicorn开启多worker),都会出现缓存不共享、重启清空的问题,这是该缓存后端的设计特性,无法避免。
文件缓存(FileBasedCache)仍丢失的常见排查点
- 先确认没有其他代码逻辑调用
cache.delete('array')或者cache.clear()做全局清空,同时校验写入和读取的缓存键完全一致,不存在拼写误差。 - 检查隐式淘汰规则:Django文件缓存默认
MAX_ENTRIES为300,达到上限后会默认淘汰33%的旧缓存,你可以显式关闭淘汰逻辑测试:
CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache', 'LOCATION': os.path.join(BASE_DIR, 'filecache'), 'TIMEOUT': None, 'MAX_ENTRIES': 1000, 'CULL_FREQUENCY': 0, # 达到上限不淘汰旧数据,仅用于测试定位问题 } }
- 排查序列化失败问题:如果你存储的
array包含不可被pickle序列化的对象(比如数据库连接、线程对象、动态生成的类实例),写入时不会报错,但读取反序列化失败会直接返回None,可以加日志验证写入状态:
# 写入时校验结果 set_success = cache.set('array', array, timeout=None) # 读取后先判断是否为空 array = cache.get('array') if array is None: # 要么缓存不存在,要么反序列化失败
- 确认运行Django进程的用户对
filecache目录有完整的读、写、执行权限,部分场景下缓存文件能生成但读取时权限不足会返回空值。
稳定持久化缓存推荐方案
如果需要跨进程、重启不丢失的稳定缓存,优先使用Redis作为缓存后端,配置示例如下(需先安装依赖pip install django-redis):
CACHES = { "default": { "BACKEND": "django_redis.cache.RedisCache", "LOCATION": "redis://127.0.0.1:6379/1", "TIMEOUT": None, "OPTIONS": { "CLIENT_CLASS": "django_redis.client.DefaultClient", } } }
内容的提问来源于stack exchange,提问作者MHDaouas
相关产品推荐
相关产品推荐

