如何验证Docker环境下Django是否使用独立Memcached容器缓存?
嘿,我来帮你梳理下在Docker跨容器场景下,验证Memcached缓存是否真的生效的靠谱方法——这些方法都能准确反映实际情况,不用担心跨容器的影响:
1. 用Django Shell直接测试(最准确)
这是最直接的方式,因为你是在Django容器内部模拟业务代码调用缓存,和实际应用使用的是完全相同的缓存配置,结果100%可信。
操作步骤:
- 先进入你的Django容器:
docker exec -it <你的Django容器名称/ID> python manage.py shell - 在Shell里执行缓存操作:
from django.core.cache import cache # 设置一个测试缓存键,有效期60秒 cache.set('test_cache_key', 'hello_cross_container', 60) # 获取这个键 cache.get('test_cache_key')
如果返回'hello_cross_container',说明缓存已经正常工作。你还可以多测试几次,比如等待60秒后再get,看是否返回None,验证过期逻辑是否生效。
2. Telnet连接Memcached容器验证连通性
这个方法可以直接检查Memcached服务本身是否能被Django容器访问,以及缓存操作是否正常。
注意:跨容器场景下,你可以选择在Django容器内telnet(更贴近实际调用路径),或者在宿主机(如果Memcached容器映射了端口到宿主机)操作。
方法A:在Django容器内操作
- 先给Django容器安装telnet工具(如果镜像里没有的话):
- Debian/Ubuntu系镜像:
apt-get update && apt-get install -y telnet - Alpine系镜像:
apk add telnet
- Debian/Ubuntu系镜像:
- 连接Memcached容器(用容器名或者容器IP,Docker内部DNS会解析容器名):
telnet <Memcached容器名称/IP> 11211 - 执行Memcached命令测试:
# 设置缓存:set 键名 标志位 有效期(秒) 数据长度 set test_key 0 60 16 hello_docker_cache # 成功会返回STORED get test_key # 成功会返回VALUE test_key 0 16 和 hello_docker_cache
你还可以用stats items命令查看缓存中的键数量,设置新键前后对比数值变化,确认缓存确实被存储了。
方法B:宿主机操作(如果端口映射了)
如果你的Memcached容器启动时映射了11211端口到宿主机(比如-p 11211:11211),直接在宿主机执行:
telnet localhost 11211
后续操作和上面一样。
3. 查看Memcached日志
给Memcached开启日志,能直观看到所有缓存请求记录,包括Django发起的SET/GET操作。
- 启动Memcached时配置日志输出(比如用docker-compose的话):
services: memcached: image: memcached:latest command: memcached -v volumes: - ./memcached-logs:/var/log/memcached
-v参数会让Memcached输出详细日志,包括每个请求的类型(SET/GET)、键名等。
- 查看日志:
docker logs <Memcached容器名称/ID>
当Django调用缓存时,你会看到类似这样的日志:
<28 new auto-negotiated client connection <28 set test_cache_key 0 60 21 >28 STORED <28 get test_cache_key >28 sending key test_cache_key >28 END
这就说明Django的缓存请求已经到达Memcached服务了。
4. 在Django视图中添加调试日志(贴近业务场景)
这个方法能验证缓存是否在真实业务请求中生效,适合确认缓存是否真的帮你减少了重复计算。
在你的某个视图函数中添加如下代码:
from django.core.cache import cache from django.http import HttpResponse import logging from datetime import datetime logger = logging.getLogger(__name__) def test_cache_view(request): # 尝试从缓存获取数据 cached_data = cache.get('business_data') if not cached_data: logger.info("🔴 Cache miss! Generating business data...") # 模拟耗时的业务逻辑 cached_data = "Generated expensive business data at " + str(datetime.now()) # 存入缓存,有效期5分钟 cache.set('business_data', cached_data, 300) else: logger.info("🟢 Cache hit! Using cached data.") return HttpResponse(cached_data)
然后访问这个视图,查看Django容器的日志:
docker logs -f <Django容器名称/ID>
第一次访问会看到Cache miss,第二次及之后(5分钟内)访问会看到Cache hit,同时页面返回的内容不变,这就说明缓存完全生效了。
额外注意:确认Django缓存配置正确
最后别忘了检查你的settings.py里的缓存配置是否指向Memcached容器,比如:
# 如果你用的是pymemcache(推荐) CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.memcached.PyMemcacheCache', 'LOCATION': 'memcached:11211', # 这里用Memcached容器的名称,Docker内部能解析 } } # 如果你用的是python-memcached CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache', 'LOCATION': ('memcached', 11211), } }
确保LOCATION是Memcached容器的名称或者IP,这样Django才能跨容器访问到Memcached服务。
内容的提问来源于stack exchange,提问作者dsax7

