Redis
webman/redis est basé sur illuminate/redis et ajoute des fonctionnalités de pool de connexions, supportant les environnements de coroutines et non-coroutines, avec une utilisation similaire à Laravel.
Avant d'utiliser illuminate/redis
, il est nécessaire d'installer l'extension redis pour php-cli
.
Attention
Ce manuel est pour la version v2 de webman. Si vous utilisez la version v1 de webman, veuillez consulter le manuel de la version v1.
Ce composant nécessite l'installation de l'extension redis. Utilisez la commandephp -m | grep redis
pour vérifier siphp-cli
a l'extension redis installée.
Installation
composer require -W webman/redis illuminate/events
Après l'installation, il est nécessaire de redémarrer (reload n'est pas effectif).
Configuration
Le fichier de configuration redis se trouve dans config/redis.php
return [
'default' => [
'host' => '127.0.0.1',
'password' => null,
'port' => 6379,
'database' => 0,
'pool' => [ // Configuration du pool de connexions
'max_connections' => 10, // Nombre maximum de connexions dans le pool
'min_connections' => 1, // Nombre minimum de connexions dans le pool
'wait_timeout' => 3, // Temps maximum d'attente pour obtenir une connexion du pool
'idle_timeout' => 50, // Temps d'inactivité maximum d'une connexion dans le pool avant qu'elle ne soit fermée, jusqu'à ce que le nombre de connexions soit égal à min_connections
'heartbeat_interval' => 50, // Intervalle de vérification de l'activité, ne pas dépasser 60 secondes
],
]
];
À propos du pool de connexions
- Chaque processus a son propre pool de connexions, les pools de connexions ne sont pas partagés entre les processus.
- Lorsqu'aucune coroutine n'est activée, les tâches s'exécutent dans le processus en attente, sans création de concurrence, donc le pool de connexions ne dispose que d'une seule connexion au maximum.
- Lorsqu'une coroutine est activée, les tâches s'exécutent de manière concurrente dans le processus, le pool de connexions ajuste dynamiquement le nombre de connexions selon les besoins, sans dépasser
max_connections
et sans descendre en dessous demin_connections
. - Étant donné que le nombre maximum de connexions dans le pool est
max_connections
, lorsque le nombre de coroutines effectuant des opérations Redis est supérieur àmax_connections
, certaines coroutines seront mises en attente et ne pourront pas dépasser le temps d'attentewait_timeout
, au-delà duquel une exception sera déclenchée. - Dans des situations inactives (y compris dans des environnements de coroutines et non-coroutines), les connexions seront récupérées après le délai
idle_timeout
, jusqu'à ce que le nombre de connexions soit égal àmin_connections
(min_connections
peut être 0).
Exemple
<?php
namespace app\controller;
use support\Request;
use support\Redis;
class UserController
{
public function db(Request $request)
{
$key = 'test_key';
Redis::set($key, rand());
return response(Redis::get($key));
}
}
Interface Redis
Redis::append($key, $value)
Redis::bitCount($key)
Redis::decr($key, $value)
Redis::decrBy($key, $value)
Redis::get($key)
Redis::getBit($key, $offset)
Redis::getRange($key, $start, $end)
Redis::getSet($key, $value)
Redis::incr($key, $value)
Redis::incrBy($key, $value)
Redis::incrByFloat($key, $value)
Redis::mGet(array $keys)
Redis::getMultiple(array $keys)
Redis::mSet($pairs)
Redis::mSetNx($pairs)
Redis::set($key, $value, $expireResolution = null, $expireTTL = null, $flag = null)
Redis::setBit($key, $offset, $value)
Redis::setEx($key, $ttl, $value)
Redis::pSetEx($key, $ttl, $value)
Redis::setNx($key, $value)
Redis::setRange($key, $offset, $value)
Redis::strLen($key)
Redis::del(...$keys)
Redis::exists(...$keys)
Redis::expire($key, $ttl)
Redis::expireAt($key, $timestamp)
Redis::select($dbIndex)
équivaut à
$redis = Redis::connection('default');
$redis->append($key, $value)
$redis->bitCount($key)
$redis->decr($key, $value)
$redis->decrBy($key, $value)
$redis->get($key)
$redis->getBit($key, $offset)
...
Attention
Utilisez avec précaution l'interfaceRedis::select($db)
, car webman est un framework à mémoire résidente, si une requête utiliseRedis::select($db)
pour changer de base de données, cela affectera les requêtes suivantes. Pour plusieurs bases de données, il est conseillé de configurer différents$db
en tant que différentes configurations de connexion Redis.
Utilisation de plusieurs connexions Redis
Par exemple, le fichier de configuration config/redis.php
return [
'default' => [
'host' => '127.0.0.1',
'password' => null,
'port' => 6379,
'database' => 0,
],
'cache' => [
'host' => '127.0.0.1',
'password' => null,
'port' => 6379,
'database' => 1,
],
]
La connexion utilisée par défaut est celle configurée sous default
, vous pouvez choisir quelle connexion redis utiliser avec la méthode Redis::connection()
.
$redis = Redis::connection('cache');
$redis->get('test_key');
Configuration de cluster
Si votre application utilise un cluster de serveurs Redis, vous devez utiliser la clé clusters dans le fichier de configuration Redis pour définir ces clusters :
return [
'clusters' => [
'default' => [
[
'host' => 'localhost',
'password' => null,
'port' => 6379,
'database' => 0,
],
],
],
];
Par défaut, les clusters peuvent réaliser un partitionnement client sur les nœuds, vous permettant de créer un pool de nœuds et de créer une grande quantité de mémoire disponible. Il est important de noter que le partage client ne gérera pas les situations de défaillance ; par conséquent, cette fonctionnalité est principalement conçue pour les données mises en cache obtenues à partir d'une autre base de données principale. Pour utiliser le cluster natif Redis, vous devez spécifier ce qui suit dans la clé options du fichier de configuration :
return[
'options' => [
'cluster' => 'redis',
],
'clusters' => [
// ...
],
];
Commandes en pipeline
Lorsque vous devez envoyer de nombreuses commandes au serveur en une seule opération, il est recommandé d'utiliser des commandes en pipeline. La méthode pipeline accepte une fermeture d'une instance Redis. Vous pouvez envoyer toutes les commandes à l'instance Redis, elles seront toutes exécutées en une seule opération :
Redis::pipeline(function ($pipe) {
for ($i = 0; $i < 1000; $i++) {
$pipe->set("key:$i", $i);
}
});