
django 应用通过 docker 连接 redis 后,`redis-cli` 默认无法查到缓存数据,根本原因通常是缓存后端未正确配置为 redis,或 `redis-cli` 访问了错误的数据库编号(默认 db0,而 django 缓存默认写入 db1)。
在 Django + Docker + Redis 的典型部署中,Redis 服务本身运行正常(如 Celery 的 Kombu 队列键已可见),但手动使用 redis-cli 查不到应用层缓存(如 get milan 返回 (nil),keys * 仅显示 Celery 相关键),这通常不是连接问题,而是缓存配置与 CLI 访问不匹配所致。以下是关键排查与修复步骤:
✅ 1. 确保 Django 使用 Redis 作为缓存后端
Django 默认的 CACHES 配置使用的是内存缓存(LocMemCache),它完全独立于 Redis,因此即使 Redis 正在运行,也不会存入任何数据。你必须显式配置 Redis 缓存后端。
在 settings.py 中添加或修改如下配置(推荐使用 django-redis,需先安装:pip install django-redis):
# settings.py
CACHES = {
"default": {
"BACKEND": "django_redis.cache.RedisCache",
"LOCATION": "redis://redis:6379/1", # 注意:数据库编号为 1(非默认 0)
"OPTIONS": {
"CLIENT_CLASS": "django_redis.client.DefaultClient",
}
}
}⚠️ 注意:LOCATION 中的 /1 表示使用 Redis 的 database 1。这是 django-redis 的默认行为(避免与 Celery 的 broker 占用的 db0 冲突)。若你改用 /0,则需同步调整 Celery 配置,否则可能引发竞争或覆盖。
✅ 2. 使用 redis-cli -n 访问对应数据库
redis-cli 默认连接 db0,而 Django 缓存写入的是 db1(如上配置),因此直接执行 keys * 自然查不到数据。
✅ 正确操作方式:
# 进入 Redis 容器并指定数据库 1 docker exec -it redis redis-cli -n 1 # 在 redis-cli 中查看所有缓存键 127.0.0.1:6379> keys * 1) ":1:my_cached_key" # django-redis 默认加前缀 ":1:" 2) ":1:milan" # 获取值(注意前缀) 127.0.0.1:6379> get ":1:milan" "\"Hello from cache!\""
? 提示:django-redis 默认为每个 key 添加数据库编号前缀(如 :1:keyname),可通过 KEY_PREFIX 配置自定义,但 -n 1 是必选参数。
✅ 3. 验证缓存是否真正生效
在 Django shell 中测试缓存读写(确保 DEBUG=True 且服务已重启):
docker exec -it django python manage.py shell
>>> from django.core.cache import cache
>>> cache.set('milan', 'Hello from cache!', timeout=300)
True
>>> cache.get('milan')
'Hello from cache!'此时再进入 redis-cli -n 1,即可看到对应 key。
? 补充说明:Celery 与缓存的数据库分离建议
你的 docker-compose.yml 中 Celery 的 CELERY_BROKER 和 CELERY_BACKEND 均指向 redis://redis:6379/0 —— 这是最佳实践:Broker(任务队列)和 Cache(应用缓存)应使用不同 Redis database,避免相互干扰。因此:
- ✅ Celery → db0(队列、事件、结果)
- ✅ Django Cache → db1(业务缓存)
- ❌ 不要将两者混用同一 db,否则 keys * 会混乱,且存在数据误删风险。
✅ 总结检查清单
| 项目 | 正确配置 | 验证方式 |
|---|---|---|
| CACHES['default']['BACKEND'] | "django_redis.cache.RedisCache" | 检查 settings.py |
| CACHES['default']['LOCATION'] | redis://redis:6379/1(与 Celery 的 /0 分离) | print(settings.CACHES) |
| redis-cli 访问 | docker exec -it redis redis-cli -n 1 | keys * 应返回带 :1: 前缀的 key |
| Django 缓存调用 | cache.set() / cache.get() 成功 | Shell 中执行并观察返回值 |
完成以上配置后,Django 缓存将稳定落库至 Redis db1,redis-cli -n 1 可实时观测、调试与清理,彻底解决“数据不可见”问题。










