如何在 Django + Docker 环境中正确访问 Redis 缓存数据

13次阅读

如何在 Django + Docker 环境中正确访问 Redis 缓存数据

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 可实时观测、调试与清理,彻底解决“数据不可见”问题。

text=ZqhQzanResources