You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django设置timeout为None仍无法持久化缓存数组问题求解

Django缓存TIMEOUT设为None仍丢失数据的原因及解决方案

本地内存缓存(LocMemCache)丢失的根本原因

  • LocMemCache是进程级独立缓存,每个Django工作进程都会维护自己独有的内存缓存副本,不管是重启应用、还是多进程部署(比如uWSGI/Gunicorn开启多worker),都会出现缓存不共享、重启清空的问题,这是该缓存后端的设计特性,无法避免。

文件缓存(FileBasedCache)仍丢失的常见排查点

  1. 先确认没有其他代码逻辑调用cache.delete('array')或者cache.clear()做全局清空,同时校验写入和读取的缓存键完全一致,不存在拼写误差。
  2. 检查隐式淘汰规则: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, # 达到上限不淘汰旧数据,仅用于测试定位问题
    }
}
  1. 排查序列化失败问题:如果你存储的array包含不可被pickle序列化的对象(比如数据库连接、线程对象、动态生成的类实例),写入时不会报错,但读取反序列化失败会直接返回None,可以加日志验证写入状态:
# 写入时校验结果
set_success = cache.set('array', array, timeout=None)
# 读取后先判断是否为空
array = cache.get('array')
if array is None:
    # 要么缓存不存在,要么反序列化失败
  1. 确认运行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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 09:09:05