Django+Docker集成Redis后业务数据未存入Redis求助
Django集成Redis后业务数据未写入Redis排查解决
问题现象
已完成Redis与Django的集成并通过docker-compose部署,Redis服务运行正常。但通过docker exec -it redis redis-cli连接终端后,执行keys *仅能看到Celery相关键值,业务数据未写入Redis,尝试获取业务key(如milan、kranf)返回(nil)。
docker-compose.yml配置
version: '3.8' services: web: build: . container_name: django ports: - "8000:8000" command: python manage.py runserver 0.0.0.0:8000 volumes: - .:/app env_file: - .env environment: - DEBUG=1 - DJANGO_ALLOWED_HOSTS=localhost 127.0.0.1 - CELERY_BROKER=redis://redis:6379/0 - CELERY_BACKEND=redis://redis:6379/0 - REDIS_HOST=redis depends_on: - db - redis links: - db:db db: container_name: postgres image: postgres volumes: - ./data/postgres_data:/var/lib/postgresql/data environment: - POSTGRES_DB=${BD_NAME} - POSTGRES_USER=${BD_USER} - POSTGRES_PASSWORD=${BD_PASSWORD} - POSTGRES_HOST_AUTH_METHOD=trust expose: - '5432' redis: image: "redis:alpine" restart: always container_name: redis command: redis-server ports: - 6379:6379 celery: build: . command: celery -A wishes worker -l INFO volumes: - .:/app depends_on: - web - redis - db environment: - CELERY_BROKER=redis://redis:6379/0 - CELERY_BACKEND=redis://redis:6379/0 volumes: postgres_data:
redis-cli操作示例
127.0.0.1:6379> get milan (nil) 127.0.0.1:6379> keys * 1) "_kombu.binding.celeryev" 2) "_kombu.binding.celery" 3) "_kombu.binding.celery.pidbox" 127.0.0.1:6379> keys * 1) "_kombu.binding.celeryev" 2) "_kombu.binding.celery" 3) "_kombu.binding.celery.pidbox" 127.0.0.1:6379> get kranf (nil) 127.0.0.1:6379>
排查与解决步骤
1. 核对Django的Redis配置
检查项目settings.py中的Redis缓存/存储配置,确认是否指向正确的Redis实例与数据库:
# 示例缓存配置 CACHES = { 'default': { 'BACKEND': 'django_redis.cache.RedisCache', 'LOCATION': 'redis://redis:6379/1', # 建议业务数据与Celery使用不同数据库,避免混淆 'OPTIONS': { 'CLIENT_CLASS': 'django_redis.client.DefaultClient', } } } # 自定义Redis连接示例 import redis import os REDIS_CONN = redis.Redis(host=os.environ.get('REDIS_HOST'), port=6379, db=1)
如果业务数据配置在非db0的数据库,连接Redis-cli时需切换对应数据库查看:SELECT 1。
2. 验证Django写入逻辑
进入Django容器测试写入:
docker exec -it django python manage.py shell
在shell中执行:
from django_redis import get_redis_connection r = get_redis_connection('default') r.set('test_key', 'test_value') print(r.get('test_key'))
若返回b'test_value',说明写入正常,再回到Redis-cli切换对应数据库检查数据是否存在。
3. 检查环境变量加载
确认Django容器内REDIS_HOST变量正确:
docker exec -it django env | grep REDIS_HOST
若返回异常,检查.env文件配置是否正确,或docker-compose中environment配置是否覆盖了.env内容。
4. 验证容器网络连通性
检查Django容器能否访问Redis服务:
docker exec -it django ping redis
若无法连通,确认docker-compose默认网络是否正常,若自定义网络需确保所有服务加入同一网络。
5. 查看Django日志排查错误
查看Django容器日志,定位Redis相关报错:
docker logs django
根据日志中的连接超时、认证失败等信息针对性修复。
内容的提问来源于stack exchange,提问作者KraNf
相关产品推荐
相关产品推荐

