Skip to content

Commit

Permalink
cluster Redis
Browse files Browse the repository at this point in the history
  • Loading branch information
januabisconti committed Dec 9, 2024
1 parent 0f43a80 commit 7d8a2ea
Show file tree
Hide file tree
Showing 2 changed files with 30 additions and 10 deletions.
11 changes: 9 additions & 2 deletions src/Console/ListenerCommand.php
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,8 @@ class ListenerCommand extends Command
{
protected $signature = 'supercache:listener
{--connection_name= : (opzionale) nome della connessione redis }
{--checkEvent= : (opzionale) se 1 si esegue controllo su attivazione evento expired di Redis }';
{--checkEvent= : (opzionale) se 1 si esegue controllo su attivazione evento expired di Redis }
{--isCluster= : (opzionale) se 1 ho un cluster Redis }';
protected $description = 'Listener per eventi di scadenza chiavi Redis';
protected RedisConnector $redis;
protected array $batch = []; // Accumula chiavi scadute
Expand Down Expand Up @@ -156,7 +157,13 @@ public function handle()
}

// è necessaria una connessione asyncrona, uso una connessione nativa
$async_connection = $this->redis->getNativeRedisConnection($this->option('connection_name'));
$isClusterOption = $this->option('isCluster');
$isCluster = 0;
if ($isClusterOption !== null) {
$isCluster = (int) $isClusterOption;
}
$async_connection = $this->redis->getNativeRedisConnection($this->option('connection_name'), $isCluster);

// Pattern per ascoltare solo gli eventi expired
$pattern = '__keyevent@' . $async_connection['database'] . '__:expired';
// Sottoscrizione agli eventi di scadenza
Expand Down
29 changes: 21 additions & 8 deletions src/RedisConnector.php
Original file line number Diff line number Diff line change
Expand Up @@ -25,28 +25,41 @@ public function getRedisConnection(?string $connection_name = null)
* mentre per le sottoscrizioni è necessaria una connessione async
*
* @param string|null $connection_name Optional. The name of the Redis connection to establish. If not provided, the default connection is used.
* @param int|null $isCluster Optional. Se = 1 Redis è configurato in modalità cluster
* @return array The Redis connection instance and database.
*/
public function getNativeRedisConnection(?string $connection_name = null): array
public function getNativeRedisConnection(?string $connection_name = null, int $isCluster = 0): array
{
$config = config('database.redis.' . (isNotNullOrEmpty($connection_name) ? $connection_name : 'default'));
$config = config('database.redis.' . ($connection_name ?? 'default'));
// Crea una nuova connessione nativa Redis
if ($isCluster === 1) {
$url = $config['host'] . ':' . $config['port'];
$nativeRedisCluster = new \RedisCluster(
null, // Nome del cluster (può essere null)
$url, // Nodo master
30, // Timeout connessione
30, // Timeout lettura
true, // Persistente
($config['password'] !== null && $config['password'] !== '' ? $config['password'] : null) // Password se necessaria
);

// Nel cluster c'è sempre un unico databse
return ['connection' => $nativeRedisCluster, 'database' => 0];
}
$nativeRedis = new \Redis();
// Connessione al server Redis (no cluster)

// Connessione al server Redis
// Ottengo i parametri dalla connessione Laravel
$nativeRedis->connect($config['host'], $config['port']);

// Autenticazione con username e password (se configurati)
if (isNotNullOrEmpty($config['username']) && isNotNullOrEmpty($config['password'])) {
if ($config['username'] !== null && $config['password'] !== null && $config['password'] !== '' && $config['username'] !== '') {
$nativeRedis->auth([$config['username'], $config['password']]);
} elseif (isNotNullOrEmpty($config['password'])) {
$nativeRedis->auth($config->password); // Per versioni Redis senza ACL
} elseif ($config['password'] !== null && $config['password'] !== '') {
$nativeRedis->auth($config['password']); // Per versioni Redis senza ACL
}

// Seleziono il database corretto
$database = isNotNullOrEmpty($config['database']) ? $config['database']: 0;
$database = ($config['database'] !== null && $config['database'] !== '') ? (int) $config['database'] : 0;
$nativeRedis->select($database);

return ['connection' => $nativeRedis, 'database' => $database];
Expand Down

0 comments on commit 7d8a2ea

Please sign in to comment.