我在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。
为什么会发生这种情况,如何有效地调试和解决此问题?
1条答案
按热度按时间k2arahey1#
我设法解决了这个问题。这个问题与Docker容器之间的网络通信有关。
当在Docker容器中运行应用程序时,每个容器都有自己的隔离网络。因此,当我们尝试使用'localhost'连接到Redis服务器时,它会尝试连接到应用程序运行的同一容器中的Redis服务器。
为了解决这个问题,我们需要正确设置容器之间的网络通信。下面是需要做的事情:
1.使用服务名作为主机名:在代码中,我们应该连接到'redis'(docker-compose.yml文件中定义的服务名),而不是连接到'localhost'。