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:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
<? 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 ();
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