为什么我的Python脚本在从Redis获取非空数据时返回None?

yqlxgs2m  于 2023-11-16  发布在  Redis
关注(0)|答案(1)|浏览(188)

我在Python脚本中遇到了一个问题,我从多个交换机异步获取数据并将其保存到Redis中。目标是定期更新数据并仅保留Redis中最近的记录。尽管日志显示成功保存数据,并且数据不是空的,但获取函数始终返回None。
将数据保存到Redis:

import asyncio
import logging
from redis.asyncio.client import Redis
import json

logging.basicConfig(format='%(asctime)s - %(levelname)s - %(message)s', level=logging.INFO)

async def fetch_and_save(redis_pool, exchange, method, symbol=None, interval=1):
    while True:
        try:
            data = await getattr(exchange, method)() if symbol is None else await getattr(exchange, method)(symbol)
            key = f"{exchange.__class__.__name__}:{method}"
            serialized_data = json.dumps(data)
            if symbol:
                key = f"{key}:{symbol}"
            await redis_pool.set(key, serialized_data)
            logging.info(f"Data saved for {key}")
        except Exception as e:
            logging.error(f"Error fetching {method} from {exchange.__class__.__name__}: {e}")
        await asyncio.sleep(interval)

字符串
从Redis获取数据:

async def fetch_data_from_redis(redis_host, exchange_name, method, symbol=None):
    redis = Redis(host=redis_host)
    key = f"{exchange_name}:{method}"
    if symbol:
        key = f"{key}:{symbol}"
    data = await redis.get(key)
    if data:
        return json.loads(data)
    else:
        return None


尽管成功的数据查询(根据我的日志),并确保查询的数据不是空的,并且使用的键是一致的,但fetching函数始终返回None。
为什么会发生这种情况,如何有效地调试和解决此问题?

k2arahey

k2arahey1#

我设法解决了这个问题。这个问题与Docker容器之间的网络通信有关。
当在Docker容器中运行应用程序时,每个容器都有自己的隔离网络。因此,当我们尝试使用'localhost'连接到Redis服务器时,它会尝试连接到应用程序运行的同一容器中的Redis服务器。
为了解决这个问题,我们需要正确设置容器之间的网络通信。下面是需要做的事情:

  1. Docker Compose中的服务名:在docker-compose.yml文件中,服务名用作容器之间网络通信的主机名。在本例中,Redis的服务名为'redis'。
    1.使用服务名作为主机名:在代码中,我们应该连接到'redis'(docker-compose.yml文件中定义的服务名),而不是连接到'localhost'。

相关问题