As perguntas da entrevista - pensamento pico causado pelo sistema

Veja esta pergunta rosto quando a mente imediatamente emergir da "fila", ele iria primeiro explicar a fila -lo -

Pilha e fila, que é comumente utilizado estruturas de dados, caracterizado por FIFO

Referência: https://www.cnblogs.com/be-thebest/p/9983672.html

Cena Descrição:

1. fila de inicialização, uma fila é gerado, transmitido como um parâmetro para a cauda da fila traseira maxsize inicializado para 0, 0 é também conjunto frente HOL, neste momento elementos de fila única 0, e que o ponto traseiro e frontal .

2. enfileirado, primeiro é necessário determinar se a fila está cheia (maxsize == dianteira-traseira), se não a inserção completa, se permite que a inserção completa. Quando inserido, o incremento da frente, seguido por todos os elementos para mover para a frente de modo a que uma fila (a posição da cauda para permitir a inserção de um novo elemento), em seguida, gerar um novo objecto de dados para a localização da cauda.

3. Quando uma equipe para determinar se a fila está vazia (frente == traseira), se vazio, não uma equipa. Se não esvaziar, exclua o objeto apontado para a frente e decréscimo da frente, completam a equipe.

código de implementação:

<? php 

classe de dados {
     // 数据
    privadas  $ dados ; 

    público  função __construct ( $ data ) {
         $ this -> Dados = $ dados ;
        echo  $ data . ":哥进队了<br>". PHP_EOL ; 
    } 

    Público  função getData () {
         return  $ this -> dados; 
    } 

    Público  função __destruct () {
         echo  $ this -> data. ":哥走了<br>". PHP_EOL ; 
    } 
} 

Class{Fila
     protegida  $ Frente ; // HOL 
    protegida  $ TRASEIRO ; // a cauda 
    protegido  $ Queue = array ( '0' => 'rabo de fila'); // fila de armazenamento 
    protegido  $ MAXSIZE ; // Número máximo de 

    público  função do __construct ( $ size ) {
         $ a este -> INITQ ( $ size ); 
    } 

    // initialize fila 
    privada  função INITQ ( $ size ) {
         $ a este -> Front = 0 ;
         $ a este -> 0 = TRASEIRO;
         $ A este -> MAXSIZE = $ size ; 
    } 

    // Analisando equipa vazia 
    público  função QIsEmpty () {
         return  $ a este -> Frente == $ a este -> TRASEIRO; 
    } 

    // equipe de análise completa 
    público  função QIsFull () {
         return ( o presente $ -> Front - $ o presente -> TRASEIRO) == $ a este -> MAXSIZE; 
    } 

    // Obter os primeiros dados da equipe 
    público  função getFrontDate () {
         return  $ a este -> Fila [ $ a este-> Front] -> getData (); 
    } 

    // enqueue 
    público  função INQ ( $ Dados ) {
         IF ( $ a este -> QIsFull ()) echo  $ Dados ": Eu tenho que roer uma completa (equipe completa.! não para a equipe, aguarde por favor)!". PHP_EOL ;
         a outra {
             $ a este -> Frente ++ ;
             para ( $ i = $ a este -> Front; $ i > $ a este -> TRASEIRO; $ i - ) {
                 // echo $ dados; 
                IF ( isset ( $ a este-> fila [ $ i ])) {
                     unset ( $ this -> fila [ $ i ]); 
                } 
                $ This -> fila [ $ i ] = $ this -> fila [ $ i - 1 ]; 
            } 
            $ This -> fila [ $ presente -> traseira + 1] = novos dados ( $ dados );
          print_r ( $ this -> fila);
            // echo $ this-> dianteira; 
            echo '入队成功! <br>'. PHP_EOL ; 
        } 
    } 

    // 出队
    público  função OUTQ () {
         se ( $ this -> QIsEmpty ()) echo "队空不能出队<br>!". PHP_EOL ;
        else {
             unset ( $ this -> fila [ $ this -> frente]);
            $ this -> front-- ;
            // print_r ($ this-> fila); 
            // echo $ this-> dianteira; 
            echo "出队成功! <br>". PHP_EOL ; 
        } 
    } 
} 

$ Q = nova fila (3 );
$ q -> InQ ( "小苗" );
$ Q -> INQ ( 'Ma Shuai' );
 $ Q -> INQ ( 'patina' );
 $ Q -> INQ ( 'Zhang Shijia' );
 $ Q -> OUTQ ();
 $ Q -> INQ ( "Zhou Ruixiao " );
 $ Q -> OUTQ ();
 $ Q -> OUTQ ();
 $ Q -> OUTQ ();
 $ Q -> OUTQ ();
View Code

Cenário 1: Banco de Dados

bloqueio pessimista: CRUD estão bloqueados

bloqueio otimista: no bloqueio aproximadamente igual

bloqueio exclusivo: cooperar com a transação, cometer iguais perante desbloqueio (temporariamente não encontrou qualquer diferença e bloqueio pessimista, mais tarde complementado)

1: assuntos Abertas
2: estoque de cheque, e as configurações de exibição escrever bloqueio (bloqueio exclusivo): SELECT * FROM Produtos WHERE o acima mencionado id = 1 a FOR UPDATE
3: gerar ordens de
4: desarmazenagem, configuração implícito um bloqueio de gravação (bloqueio exclusivo): produtos da SET = contagens Counts a atualização - 1. 1 = WHERE ID.
5:. a cometer, o bloqueio será liberado

Esquema 2: Distributed bloqueio (Memcached, Redis)

Redis fazer com um bloqueio distribuído, reids-> setnx ( 'lock', 1) é fornecido um bloqueio, em seguida, a execução do programa é completado o bloqueio del.

processo de bloqueio não é propício para a execução simultânea, todo mundo está esperando para o bloqueio de desbloqueio, não é recomendado.

 

Esquema 3: uma fila de mensagens (RabbidMQ, ActiveMQ, Kafka)

O pedido de encomenda para a fila de mensagens de todos, e, em seguida, um outro daemon fim do processo de fila pedido.

Simultaneidade não é afetado, mas quanto mais o tempo de espera do usuário para entrar na fila de ordens serão muitos, a experiência não é bom, não é recomendado.

  • Message Queue (RabbidMQ, ActiveMQ, Kafka) Existem dois modos de uso: Produtor -> consumidor, o editor -> Assinantes A primeira maneira é um para um, um para muitos o último é consumido, caso a equipe dados deixarão de ser salvo, o chamado burn After Reading. Mensagem memória fila e geralmente tomam diferentes serviços, para operação assíncrona entre os serviços, a dissociação operação síncrona.
  • Redis NoSQL pertencem ao tipo de cache / memória, suporte para foco rápido repetidamente ler. geração e consumo de dados pode ser o mesmo serviço, ele pode ser mais, tal como agrupamento.

Programa 4: Redis diminuindo

projeto do código

  1, quando o usuário começa a participar pico, pico de solicitação do programa de gravação Redis (uid, tempo) no.

  verificação Redis 2, se apenas o pico individuais 10 é bem sucedido, o comprimento dos dados foi armazenado já não se encontra inserido no limite superior é atingido, indicando espigão tenha sido concluída.

  3, o último ciclo armazenado nos dados de processamento Redis 10, e, em seguida, tomar lentamente dados na base de dados.

Este é um particularmente grande aumento na pressão do banco de dados, se nós pico direta na solicitação iniciada pelo usuário, cada consulta se o banco de dados atingiu o limite superior do número de pico, então a pressão será enorme base de dados. Até agora uma lista de fila Redis, e, em seguida, colocar o pedido pico para Redis dentro, e finalmente espiga de dados com sucesso escritas para o banco de dados através dos procedimentos de armazenamento, de modo que vai facilitar grandemente a pressão de mysql.

 

Redis tipo de dados tipo de lista

  Redis a lista é uma lista duplamente ligada, podem ser adicionados os dados da cabeça ou a cauda.

  * LPUSH / LPUSHX: valores na cabeça da lista (/ presente)

  * RPUSH / RPUSHX: inserir valores em (/ presente) fim da lista

  * LPOP: O primeiro elemento é removido e obter uma lista de

  * RPOP: O último elemento é removido e obter uma lista de

  * LTRIM: elementos de retenção dentro do intervalo especificado

  * LLEN: Obtém uma lista de comprimento

  * LSet: Defina o valor de elementos da lista de índice

  * LINDEX: Obtém a lista de elementos de índice

  * LRANGE: obter uma lista dos elementos dentro do intervalo especificado

Acho que você gosta

Origin www.cnblogs.com/8013-cmf/p/12614212.html
Recomendado
Clasificación