如何使用 redis-py 管理客户端在错误情况下重新连接

上次更新 2024 年 4 月 24 日

问题

当无法建立与 Redis 数据库的连接时,例如,当达到最大连接数时,Redis 是否提供重试机制,或者客户端/应用程序是否需要实现重试机制?

回答

重试机制通常在所选 Redis 客户端库中可用,并且可以使用各种参数进行配置以实现所需的行为。以下是一个示例,用于说明 `redis-py` 客户端库的行为。连接到所需的集群节点,并限制数据库的最大连接数,如下所示

rladmin tune db db:1 max_connections 1

现在,在另一个终端中打开连接,例如使用 `redis-cli`,以保持唯一的连接插槽处于繁忙状态。最后,测试以下脚本。该脚本将尝试建立新连接,但由于没有可用的插槽而失败。观察它将如何阻塞,直到 `redis-cli` 会话被释放。

import redis
from redis.retry import Retry
from redis.exceptions import (TimeoutError, ConnectionError)
from redis.backoff import ExponentialBackoff

r = redis.Redis(host='127.0.0.1', port=16071, retry=Retry(ExponentialBackoff(cap=10, base=1), 25), retry_on_error=[ConnectionError, TimeoutError, ConnectionResetError], health_check_interval=1)

print(r.ping())

参考

`redis-py` 的 后退接口