Le serveur utilise l'architecture nginx
php-fpm
et redis utilise connect pour se connecter. Chaque requête réseau doit avoir un processus php-fpm
distinct. J'ai écrit une boucle avec blPop/brPop
et sleep(5)
dans la boucle. Le navigateur a ouvert deux onglets et les a exécutés, puis lpush
a chargé 4 données dans list
et a constaté que l'onglet qui s'exécutait toujours en premier pouvait lire les deux premières données. En d'autres termes, blPop/brPop
bloque tous les autres blPop/brPop
sur l'ensemble du serveur qui écoutent la même clé ?
Voici le code que j'ai testé :
//堵塞出队列
public function test(){
tool::load('hRedis.php');
$timeOut = 20;//堵塞20秒
$cn = 'test_blist';
$ress = [];
for($i=0;$i<2;$i++){
$ress[] = hRedis::cacheListBPop($cn,$timeOut);//这里面封装了redis的blPop/brPop
sleep(5);
}
print_r($ress);
}
Pourquoi le processus qui s'exécute plus tard est-il toujours bloqué pendant la période de veille du processus qui s'exécute en premier ?
Nous avons effectué des tests plus approfondis, supprimé la boucle, exécuté chaque processus une seule fois et utilisé redis->close()
après chaque lecture. Nous avons constaté que l'heure de fin des deux processus différait encore d'environ 16 secondes.
Pour le dernier test, je l'ai mis à nouveau sur deux serveurs. Cette fois, il ne s'agissait pas de deux processus sur le même serveur, mais de deux serveurs. J'ai constaté que l'heure de fin des deux serveurs, le nombre de secondes différent, était. le nombre de secondes que j'ai insérées dans les deux serveurs. Le temps entre les données ! Pas de retard cette fois-ci !
Tout d'abord, Redis est monothread et toutes les requêtes envoyées au serveur sont mises en file d'attente et exécutées dans l'ordre. Vous avez donc dit que chaque requête réseau devrait avoir un processus distinct, ce qui, à mon avis, est incorrect. , pas côté serveur, sinon ce sera fatal pour Redis monothread,
Après avoir ouvert deux onglets, cela équivaut à ouvrir 2 clients avant d'ouvrir 2 onglets et il n'y a pas de données push, ces 2 clients sont tous les deux. en état de blocage et votre temps de blocage est défini sur 20 secondes.
Lorsque vous transmettez les données dans la liste, les deux clients effectuent l'opération brpop sur la même clé, puis le client qui exécute la commande brpop en premier peut obtenir la valeur pop. , c'est-à-dire la première page à onglet. dormez 5 secondes, affichez d'autres données, puis affichez-les. Après la fermeture du premier client, si le deuxième client exécute toujours la ligne pop, je pense qu'il devrait afficher les valeurs suivantes si l'intervalle d'ouverture est atteint. entre les deux clients est très court, il va probablement sortir. Vous pouvez ajuster l'intervalle de temps d'ouverture entre les deux clients et le tester. Ensuite, dites-moi la réponse. Merci
.
La phrase "Chaque demande réseau doit avoir un processus distinct" est fausse et a été remplacée par "Chaque demande réseau doit avoir un processus
php-fpm
distinct".La deuxième question est comme vous l'avez dit, le deuxième client affichera les valeurs suivantes, mais le moment où le deuxième client affichera la valeur est en moyenne 16 secondes plus tard que le premier client. Je veux savoir pourquoi il est si tard, n'est-ce pas. être raccourci ? Pourquoi le deuxième client ne peut-il pas écouter en même temps que le premier client ?