redis - Événement de loterie PHP plus verrouillage de la mémoire, quel est le principe?
仅有的幸福
仅有的幸福 2017-05-16 13:09:23
0
1
590

Quel est le principe de l'ajout d'un verrouillage mémoire à un événement de loterie PHP ? Comment l'implémenter ?

 fonction publique acquérir ($ clé) {
        //Si vous devez acquérir deux verrous en même temps
        if ( is_array($key) && count($key) == 2 ) {
            tandis que (VRAI) {
                $res = tableau();
                foreach($clé comme $k => $v) {
                    $res[$k] = $this->acquérir($v);
                    si ( !$res[$k] ) {
                        casser;
                    }
                }
                //Si le premier verrou n'est pas obtenu, retournez directement
                si ( !$res[0] ) {
                    $err = nouveau SysErr(System::MEMCACHE_ACQUIRE_LOCK_ERROR);
                    ErrorHandle::throwErr($err);
                } elseif( !$res[1] ) {
                    // Libérez le premier verrou, attendez et réessayez
                    $this->release($key[0]);
                    usleep(LockConfig::LOCK_TIMEWAIT);
                } autre {
                    retourner VRAI ;
                }
            }
        } autre {
            $lock_key = LockConfig::LOCK_PREFIX $clé;
            $je = 0 ;
            faire {
                $lock = $this->_memcache->add( $lock_key, 1, LockConfig::LOCK_TIMEOUT );
                //Si le verrou n'est pas obtenu pour la première fois, attendez le temps spécifié et réessayez.
                si ($i > 0) {
                    usleep(LockConfig::LOCK_TIMEWAIT);
                }
                $i++;
                //Quitter après avoir dépassé le nombre de tentatives
                si ($i > LockConfig::LOCK_RETRY_TIMES) {
                    $err = nouveau SysErr(System::MEMCACHE_ACQUIRE_LOCK_ERROR);
                    ErrorHandle::throwErr($err);
                }
            } while( !$lock );

            // enregistrement du journal
            si ($i > 1) {
                LogHelper::warning('lock.log', "Acquérir le verrou '{$lock_key}' pendant {$i} fois");
            }
            retourner $lock;
        }
    }
    
    
      /**
     * Libérer le verrouillage de la mémoire
     *
     * @param string $key La valeur de la clé après suppression du préfixe du verrou mémoire
     * @return bool Renvoie VRAI si la libération est réussie
     */
    version de fonction publique ($ clé) {
        $lock_key = LockConfig::LOCK_PREFIX $clé;
        return $this->_memcache->delete ($lock_key);
    
仅有的幸福
仅有的幸福

répondre à tous(1)
为情所困

Vous n'avez pas besoin du verrouillage mémoire pour la loterie. Il devrait être possible d'utiliser une file d'attente ou une transaction Redis et d'ajouter un verrou Mysql. .

Je ne sais pas si le verrouillage de la mémoire que vous souhaitez est le suivant :
$lock = new CacheLock('key_name');
$lock->lock(); );
Le verrouillage de processus CacheLock est principalement utilisé pour l'acquisition de cache à un seul processus lorsque le cache ne parvient pas à empêcher les requêtes SQL excessives de pénétrer dans la base de données. Il est utilisé pour résoudre le contrôle de verrouillage de PHP pendant la concurrence et effectue le verrouillage inter-processus via le fichier. /eaccelerator.Sinon, utilisez eaccelerator pour traiter les verrous de fichiers et générez des verrous avec la granularité correspondante dans le répertoire correspondant. En utilisant eaccelerator, le traitement est effectué en mémoire et les performances sont relativement élevées en parallèle, similaires à la ligne. -verrous de niveau de mysql innodb.

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal