Python Django怎么使用本地内存缓存_配置LocMemCache加速短效数据

老伟吖_9945

老伟吖_9945

2026-04-09

584人浏览

原创

LocMemCache 是 Django 基于内存和线程本地存储的缓存后端,适合开发调试、单进程部署及短生命周期数据缓存;不适用于多进程部署或需跨实例共享的场景。

python django怎么使用本地内存缓存_配置locmemcache加速短效数据

LocMemCache 是什么,适合哪些场景

Django 的 LocMemCache 是基于 Python dict 和线程本地存储实现的内存缓存后端,所有数据只存在当前进程内存里,不跨进程、不持久、不共享。它适合开发调试、单进程部署(如 runserver)、或缓存生命周期极短(秒级)、且无需多实例一致性的数据,比如模板片段、视图中间计算结果、临时 token 校验状态。

不适用于:多 worker 部署(如 Gunicorn 多进程)、需要跨请求共享缓存、或要求高命中率和长期稳定的场景——因为每个进程都有独立缓存副本,更新不同步,且重启即丢。

怎么在 settings.py 里正确配置 LocMemCache

Django 默认不启用任何缓存,必须显式配置 CACHES。LocMemCache 不依赖外部服务,但有几个关键参数容易被忽略:

  • BACKEND 必须设为 'django.core.cache.backends.locmem.LocMemCache'
  • LOCATION 可选,用于区分多个缓存实例(如 'default' 或 'session_cache'),同一 LOCATION 下的缓存键才共享
  • OPTIONS 中的 'MAX_ENTRIES' 默认是 300,超限后会触发 LRU 清理;如果缓存大量小对象,建议调大(如 1000)
  • 不支持 TIMEOUT 全局默认值设为 None(永不过期),但实际仍受内存回收和 MAX_ENTRIES 影响
CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',
        'LOCATION': 'default',
        'OPTIONS': {
            'MAX_ENTRIES': 1000,
        }
    }
}

用 cache.set / cache.get 时要注意什么

LocMemCache 行为和 Redis 缓存看似一致,但有几处关键差异:

macOS UI 自动化技能包 —— 用 Python 控制你的 Mac
macOS UI 自动化技能包 —— 用 Python 控制你的 Mac

让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript 系统要求 macOS 14+ (Sonoma) Python 3.9+ 需要开启:辅助功能 + 屏幕录制权限

下载
  • 缓存键必须是字符串;传入 int、list、dict 会静默失败或报 TypeError(Django 会尝试序列化,但 LocMem 不强制要求可序列化,某些复杂对象可能出错)
  • timeout 参数为 0 表示“不过期”,但实际仍受 MAX_ENTRIES 限制,不是真正永久
  • 多线程下安全,但多进程间完全隔离——你在 Gunicorn 启 4 个 worker,就有 4 份互不通信的缓存
  • 使用 cache.add() 时,如果键已存在,返回 False 且不覆盖;而 cache.set() 总是写入,这点和其他后端一致

常见错误现象:cache.get('user_123') 总是返回 None,但确认代码执行了 set——大概率是进程不一致(比如用 runserver 测试正常,上线后换 Gunicorn 就失效)。

怎么验证 LocMemCache 是否生效

别只看逻辑是否跑通,要确认缓存真被用了:

  • 开启 Django 日志,把 django.core.cache 设为 DEBUG 级别,能看到每次 get/set 的 key 和结果
  • 在视图中加简单计数器:cache.incr('hit_count', 1, default=0),然后访问两次,看是否从 1 变成 2(注意:LocMemCache 支持 incr,但仅限整数,且只在当前进程有效)
  • 直接打印 cache._cache(不推荐生产用,但调试时很直观):
    print(len(cache._cache))
    能看到当前缓存条目数

最容易被忽略的一点:LocMemCache 的 _cache 是线程局部的,如果你在异步任务(如 Celery)或后台线程里操作它,那个线程拥有自己独立的 _cache 实例——和主线程完全无关。所以不要指望在 Celery 任务里 set 一个 key,然后 Web 请求里 get 到。

Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!

相关专题

更多
python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

2023.07.20

1831

4

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

2023.07.25

4924

7

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.31

1789

3

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

2023.08.03

29417

23

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

3507

5

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

3527

5

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

1223

5

python合并两个列表
python合并两个列表

Python是一种强大的编程语言,具有许多方便的功能和工具。在Python中,有多种方法可以合并两个列表。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.10

616

4

python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

2743

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Uvicorn官方安装与入门手册
Uvicorn官方安装与入门手册

共0课时 | 0人学习

Python uv官方项目管理指南
Python uv官方项目管理指南

共0课时 | 0人学习

Python uv官方安装与入门文档
Python uv官方安装与入门文档

共0课时 | 0人学习