Galeria de mapas mentais Aprendizagem da estrutura de conhecimento da estrutura de dados Redis
Como existem muitos tipos de dados redis e diferentes tipos de dados têm os mesmos metadados para registrar, o redis usará uma estrutura RedisObject para registrar uniformemente esses metadados. Ao salvar o tipo Long, o ponteiro RedisObject é atribuído diretamente a um número inteiro.
Editado em 2022-11-14 13:53:00Microbiologia medica, Infezioni batteriche e immunità riassume e organizza i punti di conoscenza per aiutare gli studenti a comprendere e ricordare. Studia in modo più efficiente!
La teoria cinetica dei gas rivela la natura microscopica dei fenomeni termici macroscopici e le leggi dei gas trovando la relazione tra quantità macroscopiche e quantità microscopiche. Dal punto di vista del movimento molecolare, vengono utilizzati metodi statistici per studiare le proprietà macroscopiche e modificare i modelli di movimento termico delle molecole di gas.
Este é um mapa mental sobre uma breve história do tempo. "Uma Breve História do Tempo" é um trabalho científico popular com influência de longo alcance. Ele não apenas introduz os conceitos básicos da cosmologia e da relatividade, mas também discute os buracos negros e a expansão. Do universo. questões científicas de ponta, como inflação e teoria das cordas.
Microbiologia medica, Infezioni batteriche e immunità riassume e organizza i punti di conoscenza per aiutare gli studenti a comprendere e ricordare. Studia in modo più efficiente!
La teoria cinetica dei gas rivela la natura microscopica dei fenomeni termici macroscopici e le leggi dei gas trovando la relazione tra quantità macroscopiche e quantità microscopiche. Dal punto di vista del movimento molecolare, vengono utilizzati metodi statistici per studiare le proprietà macroscopiche e modificare i modelli di movimento termico delle molecole di gas.
Este é um mapa mental sobre uma breve história do tempo. "Uma Breve História do Tempo" é um trabalho científico popular com influência de longo alcance. Ele não apenas introduz os conceitos básicos da cosmologia e da relatividade, mas também discute os buracos negros e a expansão. Do universo. questões científicas de ponta, como inflação e teoria das cordas.
Aprendizagem da estrutura de conhecimento da estrutura de dados Redis
Problemas de consistência de cache
Atualize o banco de dados primeiro e depois exclua o cache
(1) O cache acabou de expirar (2) Solicite A para consultar o banco de dados e obter um valor antigo (3) Solicitação B para gravar o novo valor no banco de dados (4) Solicitação B para excluir cache (5) Solicite A para gravar o valor antigo encontrado no cache
O acima causará dados sujos
Mas somente se 3 entre 2 e 3 for mais rápido que 2, B excluirá o cache primeiro e A gravará o cache com o valor antigo.
Na verdade, escrever no banco de dados é muito mais lento que ler, portanto evite SQL lento.
Exclua o cache primeiro e depois grave no banco de dados
(1) Elimine o cache primeiro (2) Escreva o banco de dados novamente (essas duas etapas são iguais às anteriores) (3) Durma por 1 segundo e elimine o cache novamente
Use exclusão dupla assíncrona
Operações básicas
Operações comuns
Verifique o número e o comprimento
Se existe, contém, acrescenta, aumenta ou diminui a chave ou um determinado campo sob a chave
Excluir, excluir o local especificado, excluir e obter
tema grátis
tipo de dados
Chave
Excluir, existir, visualizar, combinar por padrão (coleções grandes terão problemas de desempenho),
Scan itera todas as chaves,
Classificar lista, definir
Migrar de uma instância do Redis para outra instância do Redis
Defina, cancele o tempo de expiração e obtenha o tempo de expiração restante da chave
Como o Redis elimina chaves expiradas Existem duas maneiras de expirar as chaves Redis: passiva e ativa. Quando alguns clientes tentarem acessá-la, a chave será descoberta e expirará ativamente. Claro, isso não é suficiente, pois algumas chaves expiradas nunca serão acessadas. Essas chaves devem expirar de qualquer maneira, portanto, um teste aleatório cronometrado define o tempo de expiração das chaves. Todas essas chaves expiradas serão excluídas do espaço de chaves. Especificamente, isto é o que o Redis faz 10 vezes por segundo: Teste 20 chaves aleatórias para detecção de expiração relacionada. Exclua todas as chaves expiradas. Se mais de 25% das chaves expirarem, repita a etapa 1. Este é um algoritmo probabilístico trivial. A suposição básica é que nossa amostra é o controle de chave e continuamos repetindo a detecção de expiração até que a porcentagem de chaves expiradas seja inferior a 25%, o que significa que a qualquer momento Em um determinado momento, em. a maioria de 1/4 das chaves expiradas será apagada.
Definir
Sdiff obtém os elementos que não existem no conjunto SDiff a b é equivalente a a-b
Sdiff Store armazena a diferença definida em uma chave
Encontre a união de vários conjuntos, que podem ser armazenados em uma chave
SInter pega a interseção SInterStore escreve a interseção em uma chave
Lista
Operação BLOCK, bloqueando um valor do início e do fim da fila
Você pode especificar para obter valores de várias filas
Quando a fila estiver vazia, o cliente será bloqueado até que haja uma gravação. Você pode especificar um tempo limite e retornar nulo após o tempo limite.
As operações de bloqueio garantem justiça
Redis 2.4 e 2.6 são diferentes Quando vários valores são gravados ao mesmo tempo, como a, b, c, o cliente cuja chave está bloqueada receberá a em 2.4 e c em 2.6.
Após a exclusão do valor do servidor, se o cliente desligar antes do valor ser processado, o mecanismo de confirmação de mensagem do RabbitMQ pode resolver esse problema.
Você pode usar a operação de bloqueio de List combinada com operações atômicas de outros tipos de dados na mesma transação para fornecer comportamento de bloqueio para o cliente.
É possível conseguir bloqueios distribuídos de forma justa?
Semelhante às operações fornecidas por List em Java, o LTrim é adicionado para interceptar valores em um determinado intervalo.
Remova o último elemento da lista e coloque-o em outra lista
tema grátis
coleção ordenada
Você pode executar operações de redução na união de vários conjuntos ordenados, suportando SUM, MIN e MAX.
Retorna a classificação de uma chave em um conjunto ordenado
Você pode obter um determinado intervalo de valores em um conjunto ordenado, também pode especificar as pontuações mínimas e máximas para consultar o conjunto neste intervalo em páginas;
Iterar sobre uma coleção
Transação
assistir
O comando WATCH pode monitorar uma ou mais chaves. Depois que uma das chaves for modificada (ou excluída), as transações subsequentes não serão executadas. O monitoramento continua até o comando EXEC. Contanto que o valor seja modificado antes da execução do exec, a transação não será executada.
Como a função do comando WATCH é apenas impedir a execução de uma transação subsequente quando o valor da chave monitorada for modificado, ele não pode garantir que outros clientes não modificarão o valor da chave. Portanto, em geral, precisamos reexecutar o valor da chave. Execução EXEC após falha de toda a função. Garantido com um loop
Após executar o comando EXEC, o monitoramento de todas as chaves será cancelado. Caso não queira executar os comandos na transação, você também pode usar o comando UNWATCH para cancelar o monitoramento. Em alguns cenários de negócios, após observar, podemos não necessariamente realizar operações de transação.
O comando Watch é uma tecnologia de bloqueio otimista. Enquanto esse valor de chave for modificado, as modificações válidas subsequentes não terão efeito. Este método geralmente pode ser usado para reduzir as condições de corrida.
Na verdade, Exec executa todas as instruções na transação e limpa o comando watch.
A resposta do comando Exec é uma matriz, consistente com a ordem de execução do comando.
Mesmo que um/alguns comandos na transação falhem na execução, outros comandos na fila de transações ainda continuarão a ser executados - o Redis não interromperá a execução dos comandos na transação.
Antes da transação executar EXEC, podem ocorrer erros nos comandos enfileirados. Por exemplo, o comando pode produzir erros de sintaxe (número errado de parâmetros, nomes de parâmetros errados, etc. Neste caso, o cliente irá parar de executar a transação
Todos os comandos executados desde o início do comando Mutil até o comando exec serão inseridos na fila de transações.
Cerquilha
Se existe, adicione, exclua, obtenha todas as chaves, valores, itere a coleção de hash
Incrementar o valor hash de uma chave Se a chave não existir, defina-a como valor de incremento 0.
tema grátis
Armadilhas da estrutura de dados
Quando o tamanho da string precisar ser expandido, se for menor que 1M, será duplicado. Se for maior que 1M, será expandido apenas em 1M de cada vez.
Se o valor do autoincremento exceder o valor máximo, um erro será relatado.
Para estruturas de dados do tipo contêiner, se o contêiner não existir, crie-o; se o elemento não existir mais, exclua o contêiner.
Bloqueio distribuído
Solução de nó único (bloqueio não vermelho)
Obter bloqueio
hash para um nó de cluster
Se não existir, defina o caminho de bloqueio. Defina o tempo de expiração.
O bloqueio é a configuração do valor do ID do cliente
Configure um watchdog e atualize o bloqueio regularmente. Isso pode ser implementado usando uma fila de atraso.
Caso o bloqueio não seja adquirido, considere bloquear e aguardar a aquisição.
Desbloquear
Se o tempo de expiração não for definido, causará um problema de conflito.
a) Depois que ocorre uma troca mestre-escravo no redis, alguns bloqueios podem ser perdidos.
Compare com zk
O bloqueio distribuído implementado pelo Zookeeper na verdade tem uma desvantagem, ou seja, o desempenho pode não ser tão alto quanto o serviço de cache. Porque sempre durante o processo de criação e liberação de um bloqueio, nós transitórios devem ser criados e destruídos dinamicamente para implementar a função de bloqueio. A criação e exclusão de nós no ZK só podem ser realizadas através do servidor Líder, e então os dados não são compartilhados com todas as máquinas Seguidoras. Problemas de simultaneidade podem incluir instabilidade de rede e a conexão da sessão entre o cliente e o cluster ZK é interrompida. O cluster ZK pensa que o cliente está inativo e excluirá o nó temporário. Neste momento, outros clientes podem obter o bloqueio distribuído.
Redis é difícil de alcançar justiça
bloqueio vermelho
Na versão distribuída do algoritmo, assumimos que temos N hosts Redis. Os nós são completamente independentes, portanto não utilizamos replicação ou qualquer outro sistema de coordenação implícito. Descrevemos como adquirir e liberar bloqueios com segurança em uma única instância. Assumimos que o algoritmo usará esse método para adquirir e liberar bloqueios em uma única instância. Em nosso exemplo, definimos N = 5, que é um valor razoável, portanto, precisamos executar 5 servidores mestres Redis em diferentes computadores ou máquinas virtuais para garantir que eles falhem de maneira independente. Para adquirir o bloqueio, o cliente realiza as seguintes operações: 1. Obtém a hora atual em milissegundos. 2. Ele tenta adquirir o bloqueio em todas as N instâncias em ordem, usando o mesmo nome de chave e valor aleatório em todas as instâncias. Durante a etapa 2, quando o bloqueio é definido em cada instância, o cliente usa um pequeno tempo limite comparado ao tempo total de liberação automática do bloqueio para adquiri-lo. Por exemplo, se o tempo de liberação automática for de 10 segundos, o tempo limite poderá estar na faixa de aproximadamente 5 a 50 ms. Isso evita que os clientes permaneçam bloqueados por longos períodos de tempo, tentando e não conseguindo se comunicar com um nó Redis: se uma instância estiver indisponível, devemos tentar se comunicar com a próxima instância o mais rápido possível. 3. O cliente calcula o tempo necessário para adquirir o bloqueio subtraindo o carimbo de data/hora obtido na etapa 1 do horário atual. Um bloqueio é considerado adquirido se e somente se o cliente for capaz de adquiri-lo na maioria das instâncias (pelo menos 3) e o tempo total decorrido para adquirir o bloqueio for menor que o tempo de validade do bloqueio. 4. Se um bloqueio for adquirido, o seu tempo de validade é considerado o tempo de validade inicial menos o tempo decorrido, conforme calculado no passo 3. 5. Se o cliente não conseguir adquirir o bloqueio por algum motivo (incapaz de bloquear N/2 1 instâncias ou tempo de validade negativo), ele tentará desbloquear todas as instâncias (mesmo que pense que não é capaz de bloquear).
Quando um nó é desligado, não há risco de o bloqueio ser interrompido.
esconderijo
Inválido
Defina um valor aleatório para o tempo de falha para evitar falha coletiva
Implementação de estrutura de dados
Cenários de aplicação
zset
Registre a lista de IDs de postagem do usuário.
Registre a lista de IDs de postagens da lista de favoritos, lista de favoritos de categoria.
Usado para gravar um para muitos, e a festa com muitos não pode ser repetida estritamente.
Registre uma determinada coleção, que pode estar relacionada ao usuário ou ao sistema como um todo.
cerquilha
Registre o número de curtidas, comentários e cliques em uma postagem.
Registre o título da postagem, resumo, autor, informações da capa, etc.
Armazene em cache o conteúdo recente da postagem (o conteúdo da postagem é muito grande e não é adequado para busca no banco de dados)
lista
Registre a lista de artigos relacionados da postagem. Recomende postagens relacionadas com base no conteúdo.
bitmap
Usado como uma matriz bool ou uma matriz de bits personalizada, principalmente para economizar memória
HyperLogLog
Usado para calcular aproximadamente valores estatísticos após a desduplicação.
Por exemplo, o UV do site precisa filtrar visitas repetidas
Você só pode somar e obter o número total, mas não pode saber se existe um determinado valor ou todos os elementos.
filtro de flor
Usado para remover duplicatas.
Se existe, não necessariamente existe realmente Se não existe, definitivamente não existe
Considere recomendar recursos não visitados aos usuários
Considere não reutilizar recursos várias vezes.
Uma determinada taxa de falha deve ser tolerada, ou seja, o recurso pode não ser acessado, mas é considerado como tendo sido acessado.
Use vários algoritmos Hash e defina os bits do mapeamento de chave como 1.
Se não existe, definitivamente não existe!!!!
Existem apenas comandos add e exist (múltiplos podem ser verificados)
Você pode usar parâmetros iniciais para definir o filtro error_rate é a taxa de erro. Quanto menor o valor, maior a capacidade. inicial_size é o valor total estimado. O valor total deve ser definido de acordo com o cenário real.
Célula Redis
Se o projeto não for grande e o custo de manutenção não for alto, você poderá usar o redsi-cell diretamente. Caso contrário, você poderá considerar o controle refinado para cada nó de serviço para limitar o fluxo e implementá-lo com a estratégia de balanceamento de carga correspondente.
Use zset e pontuação para circular a janela de tempo e contar o número de vezes que o mesmo comportamento ocorre para o mesmo usuário dentro da janela de tempo. Se o número de limites atuais for muito grande, pode não ser aplicável, como 1.000 vezes por segundo. .
Teste CL.THROTTLE 100 400 60 3
Teste a capacidade da chave 100 (simultaneidade máxima) até 400 vezes em 60 segundos. Desta vez, 3 capacidades são aplicadas.
1: Se foi bem-sucedido, 0: Sucesso, 1: Rejeitado 2: A capacidade do token bucket, o tamanho é o valor inicial 1 3: Tokens disponíveis no token bucket atual 4: Se a solicitação for rejeitada, este valor indica quanto tempo levará até que o token seja adicionado novamente ao bucket do funil. Unidade: segundos, que pode ser usado como tempo de nova tentativa. 5: Indica quanto tempo levará para que os tokens no token bucket fiquem cheios.
algoritmo de funil
estrutura de dados especial
Lista vinculada compactada
É composto de listas vinculadas ou matrizes compactadas, a fim de evitar a sobrecarga adicional de memória das listas vinculadas comuns.
Uma lista duplamente encadeada projetada para economizar memória tanto quanto possível
Armazenar string ou inteiro
Economize memória em detalhes, usando codificação de comprimento variável para armazenamento de valor
Cada item terá um número separado de dígitos para marcar o comprimento dos dados e o tipo do item.
Implementação de estruturas de dados subjacentes de hash, lista e zset
Características
1) A representação interna é uma matriz de memória contínua na qual os dados são organizados de forma compacta.
2) Você pode simular uma estrutura de lista duplamente vinculada e entrar e retirar da fila com complexidade de tempo O(1).
3) A nova operação de exclusão envolve realocação ou liberação de memória, o que aumenta a complexidade da operação.
4) As operações de leitura e gravação envolvem movimentos complexos do ponteiro, e a complexidade de tempo do pior caso é O(n2).
5) Adequado para armazenar pequenos objetos e dados de comprimento limitado.
1) Ao usar ziplist para cenários com requisitos de alto desempenho, é recomendado que o comprimento não exceda 1000 e o tamanho de cada elemento seja controlado dentro de 512 bytes.
tabela de salto
A lista de pulos suporta pesquisa média O(logN) e pesquisa de complexidade O(N) de pior caso.
Por que não usar árvores ou árvores equilibradas em vez de mesas de salto?
A implementação da tabela de salto é muito simples e pode atingir o nível O(logN).
lista vinculada rapidamente
A lista vinculada compactada é vinculada usando ponteiros para se tornar uma lista vinculada
O valor padrão de cada ziplist é 8k (configurável).
Operação e manutenção
monitor
2) Use o comando info Commandstats para obter o tempo médio de comando, incluindo o número de chamadas para cada comando. , o tempo total gasto, o tempo médio gasto, em microssegundos.
Senhor de escravos
A função de replicação do Redis é dividida em duas operações: sincronização (sincronização) e propagação de comando (propagação de comando):
As operações de sincronização são usadas para recuperar o estado do banco de dados do servidor Atualize para o estado atual do banco de dados do servidor principal;
A operação de propagação do comando é usada para modificar o estado do banco de dados no servidor principal. Quando o status do banco de dados do servidor mestre-escravo for inconsistente, deixe o servidor mestre-escravo O banco de dados do servidor retorna a um estado consistente.
Separação de leitura e gravação
A separação de leitura e gravação é adequada para acesso grande (tão grande que uma única máquina Redis parece muito lenta), e a operação de gravação é muito menor do que a operação de leitura.
Se o número de solicitações de leitura exceder em muito as solicitações de gravação, o custo da cópia de dados do cluster será muito menor que o custo da solicitação de leitura. Ao mesmo tempo, se pudermos aceitar a inconsistência de dados até certo ponto, podemos separar a leitura e a escrita.
cluster redis
característica
1. Todos os nós redis estão interconectados entre si (mecanismo PING-PONG) e um protocolo binário é usado internamente para otimizar a velocidade de transmissão e a largura de banda.
2. A falha de um nó entra em vigor somente quando mais da metade dos nós do cluster detectam falhas.
3. O cliente está conectado diretamente ao nó redis, sem a necessidade de uma camada de proxy intermediária. O cliente não precisa se conectar a todos os nós do cluster, basta conectar-se a qualquer nó disponível no cluster.
4. O redis-cluster mapeia todos os nós físicos para o slot [0-16383] (não necessariamente distribuído uniformemente), e o cluster é responsável por manter o valor do nó<->slot<->.
Cada nó Redis precisa executar um comando e declarar o slot pelo qual é responsável.
cluster adiciona slots {slot_index1} {slot_index 2} {slot_index 3}
5. O cluster Redis é pré-dividido em 16384 buckets. Quando um valor-chave precisa ser colocado no cluster Redis, é decidido de acordo com o valor de CRC16(key) mod 16384 em qual bucket uma chave deve ser colocada.
Cada instância do Redis está ciente da existência de outros nós
Uma consistência forte não pode ser garantida
1. Seu cliente grava no nó B do servidor principal 2. O nó do servidor principal B responde ao seu cliente para confirmar. 3. O nó servidor mestre B propaga a gravação para seus servidores escravos B1, B2 e B3.
Se após a etapa 2 nenhum dado for enviado do servidor escravo e B desligar, a chave será perdida (a chave será definitivamente perdida durante a falha)
tolerância ao erro
O processo de eleição envolve a participação de todos os mestres no cluster. Se mais da metade dos nós mestres se comunicarem com o nó com falha por mais de (cluster-node-timeout), o nó será considerado com defeito e a operação de failover será automática. provocado.
(2): Quando todo o cluster fica indisponível (cluster_state:fail)? a: Se algum mestre no cluster morrer e o mestre atual não tiver nenhum escravo, o cluster entra no estado de falha, que também pode ser entendido como entrar no estado de falha quando o mapeamento de slot do cluster [0-16383] não é concluído. b: Se mais da metade dos mestres no cluster morrerem, não importa se há um cluster escravo entrando no estado de falha.
Quando o cluster está indisponível, todas as operações no cluster ficam indisponíveis e um erro ((error) CLUSTERDOWN The cluster is down) é recebido.
failover
1. Todos os nós escravos do nó mestre offline serão eleitos para eleger um novo nó mestre. 2. O nó escravo selecionado executará o comando slave no one e se tornará o novo nó mestre. 3. O novo nó mestre revogará todas as atribuições de slots ao nó mestre offline e atribuirá esses slots a si mesmo. 4. O novo nó mestre transmite uma mensagem pong para o cluster. Essa mensagem pong permite que outros nós no cluster saibam imediatamente que o nó mudou de nó escravo para nó mestre e que o nó mestre assumiu o controle do servidor. que estava originalmente offline O slot que o nó manipula. 5. O novo nó mestre começa a aceitar solicitações de comando relacionadas ao slot que é responsável pelo processamento e a operação de failover é concluída.
eleição senhor-escravo
1. Quando o nó escravo descobre que o nó mestre que ele replica ficou offline, o nó escravo (pode haver vários nós escravos fazendo solicitações aqui) transmitirá uma mensagem cluster_type_failover_auth_request para o cluster, exigindo direitos de voto (responsável pelo processamento de slots). o nó mestre vota para este nó. 2. O nó mestre que recebe a mensagem cluster_type_failover_auth_request julgará se concorda com o nó escravo em se tornar o novo nó mestre com base em suas próprias condições (a época atual do nó votante inicial não é inferior à época atual do nó votante ). Se concordar, retornará uma mensagem cluster_type_failover_auth_ack. 3. Quando a mensagem cluster_type_failover_auth_ack for recebida do nó, o número de votos será aumentado em 1. 4. Se os votos de um nó escravo forem maiores ou iguais à metade dos nós mestres do cluster (maiores ou iguais a N/2 1), esse nó se tornará o novo nó mestre. Se nenhum nó escravo receber votos suficientes durante um ciclo de configuração, o cluster entrará em um novo ciclo de configuração, e as eleições serão realizadas aqui até que um novo nó mestre seja eleito.
Todos os nós escravos podem buscar opiniões sobre se podem se tornar mestres (aqueles que votam votarão apenas em seus próprios nós maiores), e mais da metade deles pode ser (n 1)/2
Talvez eu não possa escolher
limitações
1. Atualmente apenas são suportadas operações em lote de chaves no mesmo slot; 2. Atualmente, apenas são suportadas transações principais no mesmo slot; 3. Somente o banco de dados 0 pode ser usado (cada instância do redis possui 16 bancos de dados, que podem ser alternados através do comando select {index}); 4. Uma chave grande (como hash, lista) não pode ser mapeada para nós diferentes; 5. Atualmente, a replicação mestre-escravo de cluster oferece suporte apenas a um nível e não oferece suporte a estrutura de árvore aninhada;
Ao expandir
etapa
1. Envie para o nó de destino cluster setslot {slot_index} importando {source_node_id} 2. Envie para o nó de origem cluster setslot {slot_index} migrando {target_node_id} 3. Execução do loop do nó de origem cluster getkeysinslot {slot_index} {contagem (número de chaves)} 4. O nó de origem executa e migra a chave para o nó de destino por meio do pipeline. migrar {target_ip} {target_port} "" 0 {timeout} chaves {key1} {key2} {key3} 5. Repita as etapas 3 e 4 6. Envie notificações para todos os nós mestres do cluster cluster setslot {slot_index} nó {target_nodeid}
Cada nó conhece o nó do cluster correspondente a cada slot.
Quando o nó recebe a solicitação de comando, ele pergunta se pode tratá-lo sozinho. Em caso afirmativo, ele o processa. Caso contrário, ele retorna um erro de movimentação, transporta o IP do nó e o número da porta corretos. cliente para orientá-lo na execução. E cada operação subsequente do cliente. Assim que a chave for executada, ela irá para o nó fornecido pelo erro movido.
Códigos
Camada de acesso: O método de acesso pode ser VIP ou chamar jodis por meio de código java e, em seguida, conectar e chamar diferentes endereços proxy codis para obter funções LVS e HA de alta disponibilidade.
Camada proxy: Em seguida, a camada intermediária usa codis-proxy e zookeeper para processar a direção e distribuição dos dados. Por meio do algoritmo crc32, as chaves são distribuídas uniformemente em um determinado slot de redis diferentes para obter distribuição semelhante ao raid0, na versão antiga. do codis, os slots precisam ser alocados manualmente. Após o codis3.2, os slots serão alocados automaticamente, o que é bastante conveniente.
Camada de dados: Finalmente, o codis-proxy armazena os dados no servidor principal do servidor redis real. Como o autor do codis, Huang Dongxu, atribui grande importância à consistência dos dados e não permite inconsistências de dados causadas por atrasos de dados, a arquitetura não foi. considerado desde o início. A leitura e a gravação mestre-escravo são separadas. O servidor escravo é usado apenas como uma arquitetura redundante para failover, e o zookeeper chama redis-sentinel para implementar a função de failover.
No Codis, o Codis dividirá todas as chaves em 1.024 slots. Esses 1.024 slots correspondem ao cluster Redis. No Codis, o relacionamento de mapeamento entre esses 1.024 slots e as instâncias do Redis será mantido na memória. Este slot é configurável e pode ser definido como 2048 ou 4096. Depende de quantos nós seu Redis possui. Se forem muitos, você poderá definir mais slots.
Quando o Codis Dashbord do Codis altera as informações do slot, outros nós do Codis monitorarão as alterações do slot do ZooKeeper e as sincronizarão a tempo. Como mostrado na imagem:
zk é responsável por sincronizar as informações do slot.
Fila de prioridade
conjunto classificado
lista
Use várias filas para implementar filas prioritárias. Diferentes tarefas prioritárias entram em filas diferentes.
Ao mesmo tempo, quando os consumidores buscam dados na fila, eles suportam a busca de dados em múltiplas filas, com ordem de prioridade.
bloqueado
Iniciar vários consumidores significa iniciar vários clientes para recuperar dados.
fila de mensagens
pubsub
usar
Os assinantes podem assinar um ou vários tópicos de assinatura correspondentes
O editor publica um determinado tópico e valoriza
Os tópicos publicados serão imediatamente encaminhados aos consumidores que assinarem o tópico. Caso não haja consumidores, a mensagem será descartada.
risco
Haverá risco de perda de mensagens (quando a máquina estiver inoperante, a rede for desconectada ou a rede for interrompida e as mensagens forem perdidas)
Devido a esse recurso, o simples pubsub corre o risco de perder respostas.
A confiabilidade dos dados não pode ser garantida
Não há garantia de que pelo menos uma vez
A expansão não é flexível e não há como acelerar o consumo agregando mais consumidores.
Você pode usar vários canais e ouvir várias vezes.
lista
lista
1. Quando não há nenhum elemento na lista fornecida para ser exibido, a conexão será bloqueada pelo comando BRPOP até que o tempo de espera expire ou um elemento popável seja encontrado. 2. Quando vários parâmetros-chave são fornecidos, cada lista é verificada em sequência de acordo com a chave do parâmetro e o elemento final da primeira lista não vazia aparece. Além disso, o BRPOP se comporta da mesma forma que o BLPOP, exceto pela posição do elemento pop-up.
Se não houver tarefas na lista, a conexão será bloqueada Há um tempo limite para bloqueio de conexão. Quando o tempo limite é definido como 0, você pode esperar sem fio até que uma mensagem seja exibida.
Usando o pubsub, você também pode notificar os consumidores de que eles podem consumir da lista.
É adequado para assinatura e publicação entre duas empresas entre A e B. É mais difícil quando múltiplas linhas de negócios significam consumidores diferentes.
implementação de confirmação
Mantenha duas filas: fila pendente e tabela de tarefas (tabela hash).
trabalhadores são definidos como ThreadPool. Depois de serem enfileirados pela fila pendente, os trabalhadores alocam um thread (único trabalhador) para processar a mensagem - acrescentam um carimbo de data/hora atual e um nome de thread atual à mensagem de destino, gravam-na na tabela de execução e, em seguida, o trabalhador consome a mensagem Depois. conclusão Apague você mesmo as informações da tabela de tarefas.
Habilite uma tarefa agendada, verifique a fila de execução em intervalos regulares e verifique o carimbo de data / hora de cada elemento. Se atingir o tempo limite, o ThreadPoolExecutor do trabalhador verificará se o thread existe, a execução da tarefa atual será cancelada e a transação. será revertido. Por fim, retire a tarefa da fila de tarefas e coloque-a de volta na fila pendente.
Você pode usar zset para classificação.
Evite o uso excessivo do Redis. Use o Redis apenas para fazer as coisas em que você é melhor e fazer as coisas nas quais você não é bom. Quanto mais você fizer, mais descobrirá. Quanto mais armadilhas houver, mais difícil será desistir no final. O projeto errado no estágio inicial leva a uma alta taxa de falhas no estágio posterior. RabbitMQ não é muito complicado. A operação e manutenção também são muito simples e podem ser mescladas com o sistema empresarial.