Implémenter un mécanisme de verrouillage à l'aide de PHPRedis
P粉515066518
P粉515066518 2023-08-28 18:33:09
0
2
461

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(); }

P粉515066518
P粉515066518

répondre à tous (2)
P粉386318086

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

    P粉336536706

    Le verrouillage fonctionne bien. Cela fait simplement planter le code entre les verrous et empêche le verrouillage de se libérer :-)

      Derniers téléchargements
      Plus>
      effets Web
      Code source du site Web
      Matériel du site Web
      Modèle frontal
      À propos de nous Clause de non-responsabilité Sitemap
      Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!