Les questions d'entrevue - pic de réflexion causés par le système

Voir cette question face quand l'esprit émerge immédiatement de « file d' attente », il faudrait d' abord expliquer à la file d' attente , il -

Pile et file d' attente, il est couramment utilisé des structures de données, caractérisé par FIFO

Référence: https://www.cnblogs.com/be-thebest/p/9983672.html

Description de la scène:

1. Initialisation file d'attente, une file d'attente est générée, transmise en tant que paramètre à la file d'attente queue arrière maxsize initialisé à 0, 0 est également mis en avant HOL, à ces éléments de file d'attente de temps seulement 0, et que le point avant et arrière .

2. en file d'attente, d'abord besoin de déterminer si la file d'attente est pleine (== avant-arrière maxsize), si l'insertion complète pas, si permet l'insertion complète. Une fois inséré, l'incrément avant, suivi par tous les éléments de se déplacer vers l'avant de sorte qu'une file d'attente (la position de la queue pour permettre l'insertion d'un nouvel élément), puis générer un nouvel objet de données dans l'emplacement de la queue.

3. Quand une équipe pour déterminer si la file d'attente est vide (avant == arrière), si elle est vide, pas une équipe. Sinon vide, supprimez l'objet pointé vers l'avant et décrément avant, compléter l'équipe.

Code de mise en œuvre:

<? php 

classe données {
     // 数据
    privés  données $ ; 

    publique  fonction __construct ( $ data ) {
         $ this -> data = $ data ;
        echo  $ data . ":哥进队了<br>". PHP_EOL ; 
    } 

    Publique  fonction getData () {
         retour  $ this -> données; 
    } 

    Publique  fonction __destruct () {
         echo  $ this -> données. ":哥走了<br>". PHP_EOL ; 
    } 
} 

Classe{Queue
     protégée  avant $ ; // HOL 
    protected  ARRIÈRE $ ; // la queue 
    protégée  $ File d' attente = tableau ( '0' => 'queue de la file d' attente'); // file d'attente magasin 
    protégé  MAXSIZE $ ; // Nombre maximum de 

    publics  fonction du __construct ( $ taille ) {
         $ la présente -> INITQ ( $ taille ); 
    } 

    // initialize file d' attente 
    privée  fonction INITQ ( $ taille ) {
         $ la présente -> avant = 0 ;
         $ le présent -> 0 = ARRIÈRE;
         $ Le présent -> MAXSIZE = $ taille ; 
    } 

    // Analyser l' équipe vide 
    publique  fonction QIsEmpty () {
         retour  $ le présent -> avant == $ le présent -> arrière; 
    } 

    // Analyse équipe complète 
    publique  fonction QIsFull () {
         retour ( le $ this -> avant - $ la présente -> ARRIÈRE) == $ la présente -> MAXSIZE; 
    } 

    // Obtenir les premières données de l' équipe 
    publique  fonction getFrontDate () {
         retour  $ le présent -> File d' attente [ $ la présente-> avant] -> getData (); 
    } 

    // enqueue 
    publique  fonction INQ ( $ Data ) {
         SI ( $ la présente -> QIsFull ()) echo  $ les données « : Je dois rongera à plein (équipe complète.! pas dans l'équipe, s'il vous plaît attendre)! ». PHP_EOL ,
         l'autre {
             $ la présente -> avant ++ ;
             pour ( $ i = $ la présente -> avant; $ i > $ la présente -> arrière; $ i - ) {
                 // echo $ données; 
                SI ( isset ( $ la présente-> file d' attente [ $ i ])) {
                     unset ( $ this -> file d' attente [ $ i ]); 
                } 
                $ This -> file d' attente [ $ i ] = $ this -> file d' attente [ $ i - 1 ]; 
            } 
            $ This -> attente [ $ this -> arrière + 1] = nouvelles données ( $ data );
          print_r ( $ ce -> file d' attente);
            // avant echo $ this->; 
            echo '入队成功! <br>. PHP_EOL ; 
        } 
    } 

    // 出队
    publique  fonction OutQ () {
         si ( $ ce -> QIsEmpty ()) echo "队空不能出队<br>!". PHP_EOL ;
        d' autre {
             unset ( $ ce -> file d' attente [ $ this -> avant]);
            $ this -> front-- ;
            // print_r ($ this-> file d' attente); 
            avant // echo $ this->; 
            echo "出队成功! <br>". PHP_EOL ; 
        } 
    } 
} 

$ Q = nouvelle file d' attente (3 );
$ q -> InQ ( "小苗" );
$ Q -> INQ ( 'Ma Shuai' );
 $ Q -> INQ ( 'patinage' );
 $ Q -> INQ (Zhang Shijia ' );
 $ Q -> OUTQ ();
 $ Q -> INQ ( « Zhou Ruixiao " );
 $ Q -> OUTQ ();
 $ Q -> OUTQ ();
 Q $ -> OUTQ ();
 $ Q -> OUTQ ();
Afficher le code

Scénario 1: Base de données

verrouillage Pessimiste: CRUD sont verrouillés

Optimiste serrure: pas de serrure à peu près égale

verrou exclusif: coopérer avec la transaction, engager égaux devant le déverrouillage (temporairement n'a pas trouvé de différence et le verrouillage pessimiste, complété plus tard)

1: affaires ouvert
2: Stock de contrôle, et les paramètres d'affichage verrouillage d' écriture (verrou exclusif): SELECT * FROM marchandises WHERE ci - dessus identifiant indiqué = 1 FOR UPDATE
3: générer des commandes
4: destockage, la définition implicite d' un verrou d'écriture (verrou exclusif): SET = marchandises , le comtes comtes la mise à jour - 1. 1 = WHERE ID.
5:. le commit, le verrou est libéré

Schéma 2: Distributed Lock (Memcached, Redis)

Redis faire avec un verrou distribué, reids-> setnx ( 'lock', 1) est prévu un verrou, puis l'exécution du programme est terminé, le verrouillage del.

processus de verrouillage n'est pas propice à l'exécution simultanée, tout le monde attend le verrou pour déverrouiller, non recommandé.

 

Schéma 3: une file d'attente de messages (RabbidMQ, ActiveMQ, Kafka)

La demande de commande dans la file d'attente de messages de l'ensemble, puis un autre processus démon file d'attente de requête de commande.

Concurrency n'est pas affectée, mais plus le temps d'attente à l'utilisateur d'entrer dans la file d'attente des commandes sera beaucoup, l'expérience est pas bon, pas recommandé.

  • Message Queue (RabbidMQ, ActiveMQ, Kafka) Il existe deux modes d'utilisation: Producteur -> consommateur, l'éditeur -> Abonnés La première est un à un, un à plusieurs est le dernier consumé, le cas de l' équipe les données ne seront plus enregistrées, brûlure soi-disant après avoir lu. La mémoire de message de file d' attente et prennent généralement différents services, pour un fonctionnement asynchrone entre les services, le découplage de fonctionnement synchrone.
  • Redis NoSQL appartiennent au type de cache / mémoire, le soutien à mise au point rapide lu à plusieurs reprises. génération de données et de la consommation peut être le même service, il peut être plus, comme le regroupement.

Programme 4: Redis baisse

code de conception

  1, lorsque l'utilisateur commence spike participant, demande d'écriture de programme pic Redis (uid, temps) dans.

  2, si seule la pointe individuelle 10 est réussie, la longueur des données ont été enregistrées contrôle Redis est plus insérée dans la limite supérieure est atteinte, ce qui indique pointe est complétée.

  3, le dernier cycle mémorisé dans les données de traitement REDIS 10, puis lentement prendre des données dans la base de données.

Ceci est un pic particulièrement important dans la pression de base de données, si nous spike directement à la demande initiée par l'utilisateur, chaque requête si la base de données a atteint la limite supérieure du nombre de pointes, la pression sera énorme base de données. Maintenant une liste de file d'attente Redis, puis mettre la demande de pointe à l'intérieur Redis, et enfin pic des données écrites avec succès à la base de données à travers les procédures de stockage, il en sera grandement facilité la pression de MySQL.

 

Redis type de liste de type de données

  REDIS la liste est une liste doublement lié, les données de la tête ou la queue peuvent être ajoutés.

  * LPUSH / LPUSHX: valeurs dans la tête de la liste (/ présent)

  * RPUSH / RPUSHX à: insérer des valeurs dans (/ présent) fin de la liste

  * LPOP: Le premier élément est retiré et obtenir une liste des

  * RPOP: Le dernier élément est retiré et obtenir une liste des

  * LTRIM: éléments de retenue dans la plage spécifiée

  * LLEN: Obtient une liste de longueur

  * LSET: Définissez la valeur des éléments de la liste par index

  * LINDEX: Obtient la liste des éléments par index

  * Lrange: obtenir une liste des éléments dans la plage spécifiée

Je suppose que tu aimes

Origine www.cnblogs.com/8013-cmf/p/12614212.html
conseillé
Classement