J'ai obtenu les deux fonctions suivantes pour verrouiller la clé Redis. J'essaie d'empêcher l'exécution simultanée d'un bloc de code à l'aide de Redis. J'ai donc utilisé la fonction suivante pour empêcher différents threads d'exécuter le même code.
lockRedisKey("ABC"); CODE QUE JE NE VEUX PAS EXÉCUTER SIMULTANÉMENT ! unlockRedisKey("ABC");
Malheureusement, cela ne semble pas fonctionner et provoque une boucle infinie de lockRedisKey() jusqu'à ce que exit_time soit atteint. Qu'est ce qui pourrait aller mal?
fonction publique statique lockRedisKey($key, $value = "true") { $redis = RedisClient :: getInstance (); $time = microtime(true); $exit_time = $temps + 10 ; $sommeil = 10 000 ; faire { // Verrouiller Redis avec PX et NX $lock = $redis->setnx("lock:" . $key, $value); si ($lock == 1) { $redis->expire("lock:" . $key, "10"); renvoie vrai ; } nousdormir($sommeil); } while (microtime(true) < $exit_time); renvoie faux ; } fonction publique statique unlockRedisKey($key) { $redis = RedisClient :: getInstance (); $redis->del("lock:" . $key); }Je savais que je risquais d'être confronté à une impasse, j'ai donc décidé d'utiliser les transactions, mais je suis toujours confronté à ce problème.
fonction publique statique lockRedisKey($key, $value = "true") { $redis = RedisClient :: getInstance (); $time = microtime(true); $exit_time = $temps + 10 ; $sommeil = 10 000 ; faire { // Verrouiller Redis avec PX et NX $redis->multi(); $redis->set('lock:' . $key, $value, array('nx', 'ex' => 10)); $ret = $redis->exec(); si ($ret[0] == vrai) { renvoie vrai ; } nousdormir($sommeil); } while (microtime(true) < $exit_time); renvoie faux ; } fonction publique statique unlockRedisKey($key) { $redis = RedisClient :: getInstance (); $redis->multi(); $redis->del("lock:" . $key); $redis->exec(); }
Votre "exit_time" est trop petit. Je pense que $exit_time = $time + 10 ; signifie le fermer après 10 secondes. Cependant, le temps réglé est un micro-temps.
Vous pouvez peut-être remplacer '$exit_time = $time + 10;' par '$exit_time = $time + 100000;'. Écrit par Google Traduction
Le verrouillage fonctionne bien. Cela fait simplement planter le code entre les verrous et empêche le verrouillage de se libérer :-)