python - Redis PubSub 未重新连接

标签 python redis redis-py

我目前正在开发一个围绕 Redis Pubsub 的包装器来获取订阅者实例。我正在努力使其对连接中断具有鲁棒性。 根据文档,“如果发生网络错误或超时等断开连接,PubSub 对象将在重新连接时重新订阅所有先前的 channel 和模式”。但它似乎对我不起作用。

以下是 PubSub 流程的工作示例:

>>> import redis
>>> r = redis.Redis(host="172.17.0.2", port=6379)
>>> r.ping()
True
>>> sub = r.pubsub()
>>> sub.subscribe("test")
>>> r.publish("test","test")
1
>>> sub.get_message()
{'type': 'subscribe', 'pattern': None, 'channel': b'test', 'data': 1}
>>> sub.get_message()
{'type': 'message', 'pattern': None, 'channel': b'test', 'data': b'test'}

此时,我关闭了我的 Redis 实例。 r.ping() 按预期产生 redis.exceptions.ConnectionError

此时,我重新启动了我的 Redis 实例。

>>> r.ping()
True
>>> r.publish("test","test")
0
>>> sub.get_message()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/home/robin/.conda/envs/rb-linkvision/lib/python3.6/site-packages/redis/client.py", line 3617, in get_message
    response = self.parse_response(block=False, timeout=timeout)
  File "/home/robin/.conda/envs/rb-linkvision/lib/python3.6/site-packages/redis/client.py", line 3503, in parse_response
    if not block and not conn.can_read(timeout=timeout):
  File "/home/robin/.conda/envs/rb-linkvision/lib/python3.6/site-packages/redis/connection.py", line 734, in can_read
    return self._parser.can_read(timeout)
  File "/home/robin/.conda/envs/rb-linkvision/lib/python3.6/site-packages/redis/connection.py", line 321, in can_read
    return self._buffer and self._buffer.can_read(timeout)
  File "/home/robin/.conda/envs/rb-linkvision/lib/python3.6/site-packages/redis/connection.py", line 231, in can_read
    raise_on_timeout=False)
  File "/home/robin/.conda/envs/rb-linkvision/lib/python3.6/site-packages/redis/connection.py", line 201, in _read_from_socket
    raise ConnectionError(SERVER_CLOSED_CONNECTION_ERROR)
redis.exceptions.ConnectionError: Connection closed by server.

Redis 连接似乎已正确重新启用,但 PubSub 实例不再工作。我目前正在使用一种解决方法。

>>> sub.reset()
>>> sub.subscribe("test")
>>> sub.get_message()
{'type': 'subscribe', 'pattern': None, 'channel': b'test', 'data': 1}

我对我的解决方法很满意,但文档明确指出这应该自动处理。我有什么做得不正确的地方吗? 感谢您的回答!

最佳答案

使用health_check_interval选项创建redis客户端就成功了。

关于python - Redis PubSub 未重新连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66885484/

相关文章:

python - CodingBat 上的雪茄和松鼠拼图抛出语法错误的解决方案

python - 在 folium 中显示栅格数据(不处理任何数据值)。

python - 如何从哨兵 url 创建 redis python 客户端?

python - 尝试在 OS X (10.11.3) 上安装 PyAudio

redis - 如何使用redis在birt中创建文档

redis - Pub/Sub 和 Redis 集群

nginx lua redis cookie 未设置

python - 使用排序集通知系统

python - 如何使用python在redis中创建嵌套结构?

python - 使用已知的增量函数在不均匀数组中查找数字位置的最快方法