proofdb/vendor/illuminate/redis/Connections/PhpRedisClusterConnection.php
2026-05-01 23:40:14 +08:00

93 lines
2.1 KiB
PHP

<?php
namespace Illuminate\Redis\Connections;
use InvalidArgumentException;
class PhpRedisClusterConnection extends PhpRedisConnection
{
/**
* The RedisCluster client.
*
* @var \RedisCluster
*/
protected $client;
/**
* The default node to use from the cluster.
*
* @var string|array
*/
protected $defaultNode;
/**
* Scan all keys based on the given options.
*
* @param mixed $cursor
* @param array $options
* @return mixed
*
* @throws \InvalidArgumentException
*/
#[\Override]
public function scan($cursor, $options = [])
{
$result = $this->client->scan($cursor,
$options['node'] ?? $this->defaultNode(),
$options['match'] ?? '*',
$options['count'] ?? 10
);
if ($result === false) {
$result = [];
}
return $cursor === 0 && empty($result) ? false : [$cursor, $result];
}
/**
* Flush the selected Redis database on all master nodes.
*
* @return void
*/
public function flushdb()
{
$arguments = func_get_args();
$async = strtoupper((string) ($arguments[0] ?? null)) === 'ASYNC';
foreach ($this->client->_masters() as $master) {
$async
? $this->command('rawCommand', [$master, 'flushdb', 'async'])
: $this->command('flushdb', [$master]);
}
}
/**
* Return default node to use for cluster.
*
* @return string|array
*
* @throws \InvalidArgumentException
*/
private function defaultNode()
{
if (! isset($this->defaultNode)) {
$this->defaultNode = $this->client->_masters()[0] ?? throw new InvalidArgumentException('Unable to determine default node. No master nodes found in the cluster.');
}
return $this->defaultNode;
}
/**
* Determine if the connection is a cluster connection.
*
* @return bool
*/
#[\Override]
public function isCluster()
{
return true;
}
}