Hyperf 中获取多 Redis 连接池当前连接数需通过 RedisFactory 获取指定名称的连接池实例,再用反射读取 Pool 的 protected 属性 $createdNum 和 $usedNum;注意首次调用后需执行 Redis 命令才创建连接。

Hyperf 中获取多 Redis 连接池的当前连接数,核心是通过 RedisFactory 获取指定名称的连接池实例,再调用其底层 PDOConnectionPool 或 ConnectionPool 的统计方法。Hyperf 3.x 默认使用 Swoole\Coroutine\Channel 管理连接,连接池本身不直接暴露“已用/空闲连接数”接口,但可通过反射或内部属性间接获取。
确认 Redis 连接池配置名称
先确保你的 config/autoload/redis.php 中定义了多个连接池,例如:
'default' => [
'host' => '127.0.0.1',
'port' => 6379,
'database' => 0,
],
'cache' => [
'host' => '127.0.0.1',
'port' => 6380,
'database' => 1,
],每个键(如 default、cache)即为连接池名,后续需按此名称获取对应池实例。
通过 RedisFactory 获取连接池并读取连接数
Hyperf 的 RedisFactory 创建的是 Redis 对象,它内部持有一个 ConnectionPool 实例。该池对象继承自 Hyperf\Pool\Pool,其 $createdNum(已创建连接数)、$usedNum(当前被占用连接数)为 protected 属性,可通过反射安全读取:
- 在 Command、Controller 或 Service 中注入
Hyperf\Redis\RedisFactory - 调用
get($name)得到 Redis 实例 - 从 Redis 实例的
getPool()方法拿到连接池对象 - 用反射读取
$createdNum和$usedNum
示例代码:
use Hyperf\Redis\RedisFactory;
use Hyperf\Pool\Pool;
<p>public function getConnectionStats(string $poolName = 'default')
{
$redis = $this->redisFactory->get($poolName);
$pool = $redis->getPool();</p><pre class="brush:php;toolbar:false;">$reflection = new \ReflectionObject($pool);
$createdNum = $reflection->getProperty('createdNum')->getValue($pool);
$usedNum = $reflection->getProperty('usedNum')->getValue($pool);
return [
'pool_name' => $poolName,
'created' => (int) $createdNum,
'used' => (int) $usedNum,
'available' => (int) $createdNum - (int) $usedNum,
];}
注意连接池初始化时机
首次调用 RedisFactory::get() 时才会懒加载并初始化连接池,此时 $createdNum 可能为 0。真正建立连接要等到第一次执行 Redis 命令(如 $redis->get('x'))后,连接才会被创建并计入统计。因此建议在业务逻辑触发过至少一次 Redis 操作后再查连接数。
替代方案:监听连接池事件(高级用法)
若需实时监控,可监听 Hyperf\Pool\Event\ConnectionCreated 和 Hyperf\Pool\Event\ConnectionClosed 事件,在容器中维护全局计数器。这种方式更稳定,避免反射依赖内部属性,适合生产环境长期监控。











