diff --git a/src/Components/redis/src/Connector/PhpRedisConnector.php b/src/Components/redis/src/Connector/PhpRedisConnector.php index a55072c08..7fec83339 100644 --- a/src/Components/redis/src/Connector/PhpRedisConnector.php +++ b/src/Components/redis/src/Connector/PhpRedisConnector.php @@ -30,14 +30,14 @@ public static function connect(RedisDriverConfig $config): PhpRedisHandler { throw new \RedisException($redis->getLastError()); } - if (null !== $config->database && !$redis->select($config->database) && null !== $redis->getLastError()) + if (!$redis->select($config->database) && null !== $redis->getLastError()) { throw new \RedisException($redis->getLastError()); } self::applyOptions($redis, $config); - return new PhpRedisHandler($redis); + return new PhpRedisHandler($redis, $config); } public static function connectCluster(RedisDriverConfig $config): PhpRedisClusterHandler @@ -51,7 +51,7 @@ public static function connectCluster(RedisDriverConfig $config): PhpRedisCluste self::applyOptions($redis, $config); - return new PhpRedisClusterHandler($redis); + return new PhpRedisClusterHandler($redis, $config); } protected static function applyOptions(\Redis|\RedisCluster $redis, RedisDriverConfig $config): void diff --git a/src/Components/redis/src/Connector/PredisConnector.php b/src/Components/redis/src/Connector/PredisConnector.php index bb0b7293c..33a21cf93 100644 --- a/src/Components/redis/src/Connector/PredisConnector.php +++ b/src/Components/redis/src/Connector/PredisConnector.php @@ -18,15 +18,12 @@ public static function connect(RedisDriverConfig $config): PredisHandler 'scheme' => 'tcp', 'host' => $config->host, 'port' => $config->port, + 'database' => $config->database, ]; if ($config->password) { $params['password'] = $config->password; } - if (null !== $config->database) - { - $params['database'] = $config->database; - } if ($config->prefix) { $params['prefix'] = $config->prefix; @@ -34,7 +31,7 @@ public static function connect(RedisDriverConfig $config): PredisHandler $client = new \Predis\Client($params); $client->connect(); - return new PredisHandler($client); + return new PredisHandler($client, $config); } public static function connectCluster(RedisDriverConfig $config): PredisClusterHandler @@ -58,6 +55,6 @@ public static function connectCluster(RedisDriverConfig $config): PredisClusterH $client = new \Predis\Client($seeds, $options); $client->connect(); - return new PredisClusterHandler($client); + return new PredisClusterHandler($client, $config); } } diff --git a/src/Components/redis/src/Connector/RedisConnectionDriver.php b/src/Components/redis/src/Connector/RedisConnectionDriver.php index af5cdfa82..17299c5e5 100644 --- a/src/Components/redis/src/Connector/RedisConnectionDriver.php +++ b/src/Components/redis/src/Connector/RedisConnectionDriver.php @@ -8,6 +8,8 @@ use Imi\ConnectionCenter\Contract\IConnectionConfig; use Imi\Redis\Enum\RedisMode; use Imi\Redis\Handler\IRedisHandler; +use Imi\Redis\Handler\PhpRedisHandler; +use Imi\Redis\Handler\PredisHandler; class RedisConnectionDriver extends AbstractConnectionDriver { @@ -58,6 +60,13 @@ public function close(object $instance): void */ public function reset(object $instance): void { + if ( + !$instance->isCluster() + && $instance->isConnected() + && ($db = $instance->getConnectionConfig()->database) !== $instance->getDBNum() + ) { + $instance->select($db); + } } /** diff --git a/src/Components/redis/src/Connector/RedisDriverConfig.php b/src/Components/redis/src/Connector/RedisDriverConfig.php index ec07fbd45..f5308ab13 100644 --- a/src/Components/redis/src/Connector/RedisDriverConfig.php +++ b/src/Components/redis/src/Connector/RedisDriverConfig.php @@ -16,7 +16,7 @@ public function __construct( public readonly ?int $port, public readonly ?array $seeds, public readonly ?string $password, - public readonly ?int $database, + public readonly int $database, public readonly string $prefix, public readonly float $timeout, public readonly float $readTimeout, @@ -36,7 +36,7 @@ protected static function __create(array $config): self port: (int) ($config['port'] ?? 6379), seeds: $config['seeds'] ?? null, password: $config['password'] ?? null, - database: \array_key_exists('database', $config) ? $config['database'] : 0, + database: $config['database'] ?? 0, prefix: $config['prefix'] ?? '', timeout: (float) ($config['timeout'] ?? 3.0), readTimeout: (float) ($config['readTimeout'] ?? 3.0), diff --git a/src/Components/redis/src/Handler/AbstractRedisHandler.php b/src/Components/redis/src/Handler/AbstractRedisHandler.php index e8f61c89f..55802bd02 100644 --- a/src/Components/redis/src/Handler/AbstractRedisHandler.php +++ b/src/Components/redis/src/Handler/AbstractRedisHandler.php @@ -4,12 +4,21 @@ namespace Imi\Redis\Handler; +use Imi\Redis\Connector\RedisDriverConfig; + abstract class AbstractRedisHandler implements IRedisScanExMethod { + protected RedisDriverConfig $config; + abstract public function isConnected(): bool; public function isCluster(): bool { return $this instanceof IRedisClusterHandler; } + + public function getConnectionConfig(): RedisDriverConfig + { + return $this->config; + } } diff --git a/src/Components/redis/src/Handler/IRedisHandler.php b/src/Components/redis/src/Handler/IRedisHandler.php index 40fcb9469..f69886016 100644 --- a/src/Components/redis/src/Handler/IRedisHandler.php +++ b/src/Components/redis/src/Handler/IRedisHandler.php @@ -8,5 +8,6 @@ interface IRedisHandler { public function getInstance(): object; + public function isCluster(): bool; public function isSupportSerialize(): bool; } diff --git a/src/Components/redis/src/Handler/PhpRedisClusterHandler.php b/src/Components/redis/src/Handler/PhpRedisClusterHandler.php index ab9ded278..875c905b5 100644 --- a/src/Components/redis/src/Handler/PhpRedisClusterHandler.php +++ b/src/Components/redis/src/Handler/PhpRedisClusterHandler.php @@ -4,6 +4,7 @@ namespace Imi\Redis\Handler; +use Imi\Redis\Connector\RedisDriverConfig; use Imi\Redis\Traits\TPhpRedisMethod; use RedisCluster; @@ -14,12 +15,10 @@ class PhpRedisClusterHandler extends AbstractRedisHandler implements IRedisClust { use TPhpRedisMethod; - protected \RedisCluster $client; - public function __construct( - \RedisCluster $client, + protected \RedisCluster $client, + protected RedisDriverConfig $config, ) { - $this->client = $client; } public function getInstance(): \RedisCluster diff --git a/src/Components/redis/src/Handler/PhpRedisHandler.php b/src/Components/redis/src/Handler/PhpRedisHandler.php index 0680a2732..a67064198 100644 --- a/src/Components/redis/src/Handler/PhpRedisHandler.php +++ b/src/Components/redis/src/Handler/PhpRedisHandler.php @@ -4,6 +4,7 @@ namespace Imi\Redis\Handler; +use Imi\Redis\Connector\RedisDriverConfig; use Imi\Redis\Traits\TPhpRedisMethod; use Redis; @@ -16,6 +17,7 @@ class PhpRedisHandler extends AbstractRedisHandler implements IRedisHandler public function __construct( protected \Redis $client, + protected RedisDriverConfig $config, ) { } diff --git a/src/Components/redis/src/Handler/PredisClusterHandler.php b/src/Components/redis/src/Handler/PredisClusterHandler.php index 6622bacbc..281430a15 100644 --- a/src/Components/redis/src/Handler/PredisClusterHandler.php +++ b/src/Components/redis/src/Handler/PredisClusterHandler.php @@ -4,6 +4,7 @@ namespace Imi\Redis\Handler; +use Imi\Redis\Connector\RedisDriverConfig; use Imi\Redis\Traits\TPredisMethod; use Predis\Client; use Predis\Connection\Cluster\RedisCluster; @@ -16,7 +17,8 @@ class PredisClusterHandler extends AbstractRedisHandler implements IRedisCluster use TPredisMethod; public function __construct( - private Client $client, + protected Client $client, + protected RedisDriverConfig $config, ) { } diff --git a/src/Components/redis/src/Handler/PredisHandler.php b/src/Components/redis/src/Handler/PredisHandler.php index 77b2d7e29..2b57bdddf 100644 --- a/src/Components/redis/src/Handler/PredisHandler.php +++ b/src/Components/redis/src/Handler/PredisHandler.php @@ -4,6 +4,7 @@ namespace Imi\Redis\Handler; +use Imi\Redis\Connector\RedisDriverConfig; use Imi\Redis\Traits\TPredisMethod; use Predis\Client; @@ -15,7 +16,8 @@ class PredisHandler extends AbstractRedisHandler implements IRedisHandler use TPredisMethod; public function __construct( - private Client $client, + protected Client $client, + protected RedisDriverConfig $config, ) { } diff --git a/src/Components/redis/src/Traits/TPredisMethod.php b/src/Components/redis/src/Traits/TPredisMethod.php index 0251f5dfb..ada546c1e 100644 --- a/src/Components/redis/src/Traits/TPredisMethod.php +++ b/src/Components/redis/src/Traits/TPredisMethod.php @@ -8,7 +8,7 @@ trait TPredisMethod { - public function getDBNum() + public function getDBNum(): int { // 不建议使用,性能差 if ($this->isCluster())