Galleria mappe mentale Apprendimento del quadro di conoscenza della struttura dei dati Redis
Poiché esistono molti tipi di dati Redis e diversi tipi di dati hanno gli stessi metadati da registrare, Redis utilizzerà una struttura RedisObject per registrare in modo uniforme questi metadati Quando si salva il tipo Long, il puntatore RedisObject viene assegnato direttamente a un numero intero.
Modificato alle 2022-11-14 13:53:00Questa è una mappa mentale su una breve storia del tempo. "Una breve storia del tempo" è un'opera scientifica popolare con un'influenza di vasta portata. Non solo introduce i concetti di base della cosmologia e della relatività, ma discute anche dei buchi neri e dell'espansione dell'universo. questioni scientifiche all’avanguardia come l’inflazione e la teoria delle stringhe.
Dopo aver letto "Il coraggio di essere antipatico", "Il coraggio di essere antipatico" è un libro filosofico che vale la pena leggere. Può aiutare le persone a comprendere meglio se stesse, a comprendere gli altri e a trovare modi per ottenere la vera felicità.
"Il coraggio di essere antipatico" non solo analizza le cause profonde di vari problemi nella vita, ma fornisce anche contromisure corrispondenti per aiutare i lettori a comprendere meglio se stessi e le relazioni interpersonali e come applicare la teoria psicologica di Adler nella vita quotidiana.
Questa è una mappa mentale su una breve storia del tempo. "Una breve storia del tempo" è un'opera scientifica popolare con un'influenza di vasta portata. Non solo introduce i concetti di base della cosmologia e della relatività, ma discute anche dei buchi neri e dell'espansione dell'universo. questioni scientifiche all’avanguardia come l’inflazione e la teoria delle stringhe.
Dopo aver letto "Il coraggio di essere antipatico", "Il coraggio di essere antipatico" è un libro filosofico che vale la pena leggere. Può aiutare le persone a comprendere meglio se stesse, a comprendere gli altri e a trovare modi per ottenere la vera felicità.
"Il coraggio di essere antipatico" non solo analizza le cause profonde di vari problemi nella vita, ma fornisce anche contromisure corrispondenti per aiutare i lettori a comprendere meglio se stessi e le relazioni interpersonali e come applicare la teoria psicologica di Adler nella vita quotidiana.
Apprendimento del quadro di conoscenza della struttura dei dati Redis
Problema di coerenza della cache
Aggiorna prima il database, quindi elimina la cache
(1) La cache è appena scaduta (2) Richiedere ad A di interrogare il database e ottenere un vecchio valore (3) Richiedere a B di scrivere il nuovo valore nel database (4) Richiedi a B di eliminare la cache (5) Richiedere ad A di scrivere il vecchio valore trovato nella cache
Quanto sopra causerà dati sporchi
Ma solo se 3 tra 2 e 3 è più veloce di 2, B eliminerà prima la cache e A scriverà la cache con il vecchio valore.
In effetti, la scrittura nel database è molto più lenta della lettura, quindi evita SQL lento.
Elimina prima la cache e poi scrivi nel database
(1) Eliminare prima la cache (2) Scrivi di nuovo il database (questi due passaggi sono gli stessi di prima) (3) Sospendi per 1 secondo ed elimina nuovamente la cache
Utilizza la doppia eliminazione asincrona
Operazioni di base
Operazioni comuni
Controlla il numero e la lunghezza
Se esiste, contiene, aggiunge, aumenta o diminuisce la chiave o un determinato campo sotto la chiave
Elimina, elimina la posizione specificata, elimina e ottieni
tema libero
tipo di dati
Chiave
Elimina, esisti, visualizza, abbina per modello (raccolte di grandi dimensioni avranno problemi di prestazioni),
Scansione ripete tutte le chiavi,
Ordina elenco, imposta
Migrazione da un'istanza Redis a un'altra istanza Redis
Imposta, annulla la scadenza e ottieni la scadenza rimanente della chiave
Come Redis elimina le chiavi scadute Esistono due modi per far scadere le chiavi Redis: passive e attive. Quando alcuni client tentano di accedervi, la chiave verrà scoperta e scadrà attivamente. Naturalmente questo non basta, perché alcune chiavi scadute non saranno mai accessibili. Queste chiavi dovrebbero scadere comunque, quindi un test casuale temporizzato imposta la data di scadenza delle chiavi. Tutte queste chiavi scadute verranno eliminate dallo spazio delle chiavi. Nello specifico, questo è ciò che Redis fa 10 volte al secondo: Testare 20 chiavi casuali per il rilevamento della scadenza correlata. Elimina tutte le chiavi scadute. Se scade più del 25% delle chiavi, ripetere il passaggio 1. Questo è un banale algoritmo probabilistico. Il presupposto di base è che il nostro campione sia il controllo della chiave e continuiamo a ripetere il rilevamento della scadenza finché la percentuale di chiavi scadute non è inferiore al 25%, il che significa che in un dato momento In un determinato momento, a. la maggior parte di 1/4 delle chiavi scadute verrà cancellata.
Impostato
Sdiff ottiene gli elementi che non esistono nell'insieme SDiff a b equivale a a-b
Sdiff Store memorizza la differenza impostata in una chiave
Trova l'unione di più insiemi, che possono essere memorizzati in una chiave
SInter prende l'intersezione SInterStore scrive l'intersezione in una chiave
Elenco
Operazione BLOCK, bloccando un valore dalla testa e dalla coda della coda
È possibile specificare di ottenere valori da più code
Quando la coda è vuota, il client verrà bloccato finché non viene eseguita una scrittura. È possibile specificare un timeout e restituire nil dopo il timeout.
Le operazioni di blocco garantiscono l’equità
Redis 2.4 e 2.6 sono diversi. Quando vengono scritti più valori contemporaneamente, come a, b, c, il client la cui chiave è bloccata riceverà a in 2.4 e c in 2.6.
Dopo aver eliminato il valore dal server, se il client riattacca prima che il valore venga elaborato, il valore andrà perso. Il meccanismo di conferma del messaggio di RabbitMQ può risolvere questo problema.
È possibile utilizzare l'operazione di blocco di List combinata con operazioni atomiche di altri tipi di dati nella stessa transazione per fornire un comportamento di blocco per il client.
È possibile ottenere serrature equamente distribuite?
Similmente alle operazioni fornite da List in Java, LTrim viene aggiunto per intercettare i valori in un determinato intervallo.
Rimuovi l'ultimo elemento dall'elenco e inseriscilo in un altro elenco
tema libero
raccolta ordinata
È possibile eseguire operazioni di riduzione sull'unione di diversi insiemi ordinati, supportando SUM, MIN e MAX.
Restituisce la classificazione di una chiave in un insieme ordinato
È possibile ottenere un determinato intervallo di valori in un insieme ordinato; è inoltre possibile specificare i punteggi minimo e massimo per interrogare l'insieme in questo intervallo in pagine.
Itera su una raccolta
Transazione
orologio
Il comando WATCH può monitorare una o più chiavi Una volta modificata (o eliminata) una delle chiavi, le transazioni successive non verranno eseguite. Il monitoraggio continua fino al comando EXEC Finché il valore viene modificato prima dell'esecuzione di exec, la transazione non verrà eseguita. Ciò equivale al controllo redis durante exec.
Poiché la funzione del comando WATCH è solo quella di impedire l'esecuzione di una transazione successiva quando il valore della chiave monitorata viene modificato, non può garantire che altri client non modifichino il valore della chiave. Pertanto, in generale, dobbiamo rieseguire il comando Esecuzione EXEC dopo aver fallito l'intera funzione. Garantito con un loop
Dopo aver eseguito il comando EXEC, il monitoraggio di tutte le chiavi verrà annullato. Se non desideri eseguire i comandi nella transazione, puoi anche utilizzare il comando UNWATCH per annullare il monitoraggio. In alcuni scenari aziendali, dopo la visione, potremmo non necessariamente eseguire operazioni di transazione.
Il comando Watch è una tecnologia di blocco ottimistica. Finché questo valore di chiave viene modificato, le successive modifiche valide non avranno effetto. Questo metodo può solitamente essere utilizzato per ridurre le condizioni di competizione. Quando exec restituisce una raccolta vuota, l'operazione viene considerata fallita
Exec esegue effettivamente tutte le istruzioni nella transazione e cancella il comando watch.
La risposta al comando Exec è un array, coerente con l'ordine di esecuzione del comando.
Anche se uno/alcuni comandi nella transazione non vengono eseguiti, gli altri comandi nella coda della transazione continueranno comunque a essere eseguiti: Redis non interromperà l'esecuzione dei comandi nella transazione.
Prima che la transazione esegua EXEC, potrebbero verificarsi errori nei comandi accodati. Ad esempio, il comando potrebbe produrre errori di sintassi (numero errato di parametri, nomi di parametri errati, ecc. In questo caso, il client interromperà l'esecuzione della transazione
Tutti i comandi eseguiti dall'inizio del comando Mutil al comando exec verranno inseriti nella coda delle transazioni.
Hash
Se esiste, aggiungi, elimina, ottieni tutte le chiavi, i valori, esegui l'iterazione della raccolta hash
Incrementa il valore hash di una chiave Se la chiave non esiste, impostala su 0 incrementa il valore.
tema libero
Insidie della struttura dei dati
Quando è necessario espandere la dimensione della stringa, se è inferiore a 1 M, verrà raddoppiata. Se è maggiore di 1 M, verrà espansa solo di 1 M ogni volta. La lunghezza massima è 512 M
Se il valore di autoincremento supera il valore massimo, verrà segnalato un errore.
Per le strutture dati di tipo contenitore, se il contenitore non esiste, crealo; se l'elemento non esiste più, elimina il contenitore.
Blocco distribuito
Soluzione a nodo singolo (lucchetto non rosso)
Ottieni la serratura
hash su un nodo del cluster
Se non esiste, imposta il percorso del blocco. Imposta la data di scadenza.
Il blocco è l'impostazione del valore dell'ID client
Configura un watchdog e aggiorna regolarmente il blocco. Questo può essere implementato utilizzando una coda di ritardo.
Se il blocco non viene acquisito, considerare il blocco e l'attesa dell'acquisizione.
Sbloccare
Se l'ora di scadenza non è impostata, si verificherà un problema di deadlock.
a) Una volta che si verifica un passaggio master-slave in Redis, alcuni blocchi potrebbero andare persi.
Confronta con zk
Il blocco distribuito implementato da Zookeeper ha in realtà un difetto, ovvero le prestazioni potrebbero non essere così elevate come quelle del servizio cache. Perché ogni volta durante il processo di creazione e rilascio di un blocco, i nodi transitori devono essere creati e distrutti dinamicamente per implementare la funzione di blocco. La creazione e l'eliminazione dei nodi in ZK possono essere eseguite solo tramite il server Leader, quindi i dati non vengono condivisi su tutte le macchine Follower. Problemi di concorrenza, potrebbero esserci jitter di rete, la connessione della sessione tra il client e il cluster ZK è interrotta, il cluster zk ritiene che il client sia inattivo ed eliminerà il nodo temporaneo. A questo punto, altri client possono ottenere il blocco distribuito .
Redis è difficile da raggiungere l'equità
redlock
Nella versione distribuita dell'algoritmo, presupponiamo di avere N host Redis. I nodi sono completamente indipendenti, quindi non utilizziamo la replica o qualsiasi altro sistema di coordinamento implicito. Abbiamo descritto come acquisire e rilasciare in modo sicuro i blocchi all'interno di una singola istanza. Diamo per scontato che l'algoritmo utilizzerà questo metodo per acquisire e rilasciare i lock in un'unica istanza. Nel nostro esempio, impostiamo N = 5, che è un valore ragionevole, quindi dobbiamo eseguire 5 server master Redis su computer o macchine virtuali diversi per garantire che falliscano in modo per lo più indipendente. Per acquisire il lock il client effettua le seguenti operazioni: 1. Ottiene l'ora corrente in millisecondi. 2. Tenta di acquisire il lock in tutte le N istanze in ordine, utilizzando lo stesso nome di chiave e lo stesso valore casuale in tutte le istanze. Durante il passaggio 2, quando il blocco viene impostato in ciascuna istanza, il client utilizza un piccolo timeout rispetto al tempo totale di rilascio automatico del blocco per acquisirlo. Ad esempio, se il tempo di rilascio automatico è di 10 secondi, il timeout può essere compreso tra circa 5 e 50 ms. Ciò impedisce ai client di rimanere bloccati per lunghi periodi di tempo, tentando e fallendo di parlare con un nodo Redis: se un'istanza non è disponibile, dovremmo provare a parlare con l'istanza successiva il più rapidamente possibile. 3. Il client calcola il tempo necessario per acquisire il blocco sottraendo il timestamp ottenuto nel passaggio 1 dall'ora corrente. Un blocco viene considerato acquisito se e solo se il client è in grado di acquisire il blocco nella maggior parte dei casi (almeno 3) e il tempo totale trascorso per acquisire il blocco è inferiore al tempo di validità del blocco. 4. Se viene acquisito un blocco, il suo tempo di validità viene considerato pari al tempo di validità iniziale meno il tempo trascorso, come calcolato nel passaggio 3. 5. Se il client non riesce ad acquisire il blocco per qualche motivo (impossibilità di bloccare N/2 1 istanze o tempo di validità negativo), tenterà di sbloccare tutte le istanze (anche se ritiene di non essere in grado di bloccare).
Quando un nodo viene bloccato, non vi è alcun rischio che il blocco venga annullato.
cache
Non valido
Impostare un valore casuale per il tempo di fallimento per evitare guasti collettivi
Implementazione della struttura dei dati
Scenari applicativi
zset
Registra l'elenco degli ID dei post degli utenti
Registra l'elenco degli ID post della hot list. Hot list generale, hot list della categoria
Utilizzato per registrare uno a molti e la festa con molti non può essere ripetuta rigorosamente.
Registra una determinata raccolta, che può essere correlata all'utente o al sistema nel suo insieme.
hash
Registra il numero di Mi piace, commenti e clic su un post.
Registra il titolo del post, l'abstract, l'autore, le informazioni sulla copertina, ecc.
Memorizza nella cache i contenuti dei post più recenti (il contenuto del post è molto grande e non è adatto per il recupero da db)
elenco
Registra l'elenco degli articoli correlati al post Consiglia post correlati in base al contenuto.
bitmap
Utilizzato come array bool o array di bit personalizzato, principalmente per risparmiare memoria
HyperLogLog
Utilizzato per calcolare approssimativamente i valori statistici dopo la deduplicazione.
Ad esempio, l'UV del sito Web deve filtrare le visite ripetute
Puoi solo sommare e ottenere il numero totale, ma non puoi sapere se esiste un determinato valore o tutti gli elementi.
filtro fioritura
Utilizzato per rimuovere i duplicati. Verifica se un elemento esiste nell'elenco
Se esiste, non necessariamente esiste davvero Se non esiste, sicuramente non esiste
Considera la possibilità di consigliare risorse non visitate agli utenti
Valuta di non riutilizzare le risorse più volte.
Deve essere tollerato un certo tasso di fallimento, vale a dire che non è possibile accedere alla risorsa, ma si considera che sia stato effettuato l'accesso.
Utilizza più algoritmi Hash e imposta i bit della mappatura dei tasti su 1.
Se non esiste, sicuramente non esiste!!!!
Esistono solo comandi Aggiungi ed Esiste (è possibile selezionarne più di uno).
È possibile utilizzare i parametri iniziali per impostare il filtro. error_rate è il tasso di errore Più basso è il valore, maggiore è la capacità. dimensione_iniziale è l'importo totale stimato. L'importo totale deve essere impostato in base allo scenario reale.
Redis-cella
Se il progetto non è grande e il costo di manutenzione non è elevato, puoi utilizzare direttamente redsi-cell. Altrimenti, puoi considerare un controllo a grana fine su ciascun nodo di servizio per limitare il flusso e implementarlo con la corrispondente strategia di bilanciamento del carico.
Utilizzare zset e punteggio per circondare la finestra temporale e contare il numero di volte in cui si verifica lo stesso comportamento per lo stesso utente all'interno della finestra temporale. Se il numero di limiti correnti è troppo grande, potrebbe non essere applicabile, ad esempio 1.000 volte al secondo .
Prova CL.FARFALLA 100 400 60 3
Testare la capacità della chiave 100 (concorrenza massima) fino a 400 volte entro 60 secondi. Questa volta vengono richieste 3 capacità
1: se ha avuto successo, 0: successo, 1: rifiuto 2: La capacità del bucket di token, la dimensione è il valore iniziale 1 3: token disponibili nell'attuale bucket di token 4: se la richiesta viene rifiutata, questo valore indica quanto tempo sarà necessario prima che il token venga nuovamente aggiunto al bucket della canalizzazione Unità: secondi, che può essere utilizzato come tempo di ripetizione. 5: indica quanto tempo occorrerà perché i token nel token bucket siano pieni.
algoritmo dell'imbuto
strutture dati speciali
Elenco collegato compresso
È composto da elenchi concatenati o array compressi, per evitare il sovraccarico di memoria aggiuntivo dei normali elenchi concatenati.
Un elenco doppiamente collegato progettato per risparmiare il più possibile la memoria
Memorizza una stringa o un numero intero
Risparmia memoria nei dettagli, utilizzando la codifica a lunghezza variabile per la memorizzazione dei valori
Ogni elemento avrà un numero separato di cifre per contrassegnare la lunghezza dei dati e il tipo dell'elemento.
Implementazione delle strutture dati sottostanti di hash, list e zset
Caratteristiche
1) La rappresentazione interna è una matrice di memoria continua in cui i dati sono disposti in modo compatto.
2) È possibile simulare una struttura di elenco doppiamente collegata e inserire e rimuovere dalla coda con complessità temporale O(1).
3) La nuova operazione di cancellazione comporta una riallocazione o rilascio della memoria, il che aumenta la complessità dell'operazione.
4) Le operazioni di lettura e scrittura implicano movimenti complessi del puntatore e la complessità temporale nel caso peggiore è O(n2).
5) Adatto per memorizzare oggetti di piccole dimensioni e dati di lunghezza limitata.
1) Quando si utilizza ziplist per scenari con requisiti di prestazioni elevate, si consiglia che la lunghezza non superi 1000 e che la dimensione di ciascun elemento sia controllata entro 512 byte.
tavola per saltare
L'elenco da saltare supporta la ricerca della media O(logN) e la ricerca della complessità del caso peggiore O(N).
Perché non utilizzare alberi o alberi in equilibrio invece delle tavole da salto?
L'implementazione della tabella di salto è molto semplice e può raggiungere il livello O(logN).
elenco collegato velocemente
L'elenco collegato compresso viene collegato utilizzando puntatori per diventare un elenco collegato
Il valore predefinito di ogni ziplist è 8k (configurabile)
Funzionamento e manutenzione
tenere sotto controllo
2) Utilizzare il comando info Commandstats per ottenere il tempo medio di comando, incluso il numero di chiamate per ciascun comando. , il tempo totale impiegato, il tempo medio impiegato, in microsecondi.
Padrone-schiavo
La funzione di replica di Redis si divide in due operazioni: sincronizzazione (sync) e propagazione dei comandi (command propagate):
Le operazioni di sincronizzazione vengono utilizzate per recuperare lo stato del database dal server Aggiornamento allo stato corrente del database del server principale;
L'operazione di propagazione del comando viene utilizzata per modificare lo stato del database sul server principale. Quando lo stato del database del server master-slave è incoerente, lasciare che il server master-slave Il database del server viene riportato a uno stato coerente.
Leggere e scrivere la separazione
La separazione tra lettura e scrittura è adatta per accessi di grandi dimensioni (così grandi che una singola macchina Redis sembra molto lenta) e l'operazione di scrittura è molto più piccola dell'operazione di lettura.
Se il numero di richieste di lettura supera di gran lunga le richieste di scrittura, il costo della copia dei dati del cluster sarà molto inferiore al costo della richiesta di lettura. Allo stesso tempo, se possiamo accettare una certa incoerenza dei dati, possiamo separare la lettura e la scrittura.
cluster Redis
caratteristica
1. Tutti i nodi Redis sono interconnessi tra loro (meccanismo PING-PONG) e internamente viene utilizzato un protocollo binario per ottimizzare la velocità di trasmissione e la larghezza di banda.
2. Il guasto di un nodo diventa effettivo solo quando più della metà dei nodi nel cluster rileva guasti.
3. Il client è connesso direttamente al nodo Redis, senza la necessità di un livello proxy intermedio. Non è necessario che il client si connetta a tutti i nodi del cluster, basta connettersi a qualsiasi nodo disponibile nel cluster.
4. redis-cluster mappa tutti i nodi fisici sullo slot [0-16383] (non necessariamente distribuito uniformemente) e il cluster è responsabile del mantenimento del valore nodo<->slot<->.
Ogni nodo Redis deve eseguire un comando e dichiarare lo slot di cui è responsabile.
cluster aggiunge slot {slot_index1} {slot_index 2} {slot_index 3}
5. Il cluster Redis è pre-diviso in 16384 bucket. Quando un valore-chiave deve essere inserito nel cluster Redis, viene deciso in base al valore di CRC16(chiave) mod 16384 in quale bucket deve essere inserita una chiave.
Ogni istanza Redis è a conoscenza dell'esistenza di altri nodi
Non è possibile garantire una consistenza elevata
1. Il tuo client scrive sul nodo B del server principale 2. Il nodo B del server principale risponde al client per confermare. 3. Il nodo del server master B propaga la scrittura ai suoi server slave B1, B2 e B3.
Se dopo il passaggio 2 non vengono inviati dati dal server slave e B riattacca, la chiave andrà persa (la chiave andrà sicuramente persa durante il guasto)
tolleranza ai guasti
Il processo di elezione prevede la partecipazione di tutti i master del cluster Se più della metà dei nodi master comunicano con il nodo guasto per più di (cluster-node-timeout), il nodo viene considerato difettoso e l'operazione di failover viene eseguita automaticamente. innescato.
(2): quando l'intero cluster diventa non disponibile (cluster_state:fail)? a: Se un master nel cluster muore e il master corrente non ha uno slave, il cluster entra nello stato di errore, che può anche essere interpretato come l'ingresso nello stato di errore quando la mappatura degli slot del cluster [0-16383] non è completata. b: Se più della metà dei master nel cluster muore, non importa se c'è un cluster slave che entra nello stato di guasto.
Quando il cluster non è disponibile, tutte le operazioni sul cluster non sono disponibili e viene ricevuto un errore ((errore) CLUSTERDOWN Il cluster è inattivo).
failover
1. Tutti i nodi slave del nodo master offline verranno eletti per eleggere un nuovo nodo master. 2. Il nodo slave selezionato eseguirà il comando slave no one e diventerà il nuovo nodo master. 3. Il nuovo nodo master revocherà tutte le assegnazioni di slot al nodo master offline e assegnerà questi slot a se stesso. 4. Il nuovo nodo master trasmette un messaggio pong al cluster Questo messaggio pong consente agli altri nodi del cluster di sapere immediatamente che il nodo è cambiato da nodo slave a nodo master e che il nodo master ha preso il controllo del server. che era originariamente offline Lo slot gestito dal nodo. 5. Il nuovo nodo master inizia ad accettare le richieste di comando relative allo slot di cui è responsabile dell'elaborazione e l'operazione di failover viene completata.
elezione padrone-schiavo
1. Quando il nodo slave rileva che il nodo master che replica è andato offline, il nodo slave (potrebbero esserci più nodi slave che effettuano richieste qui) trasmetterà un messaggio cluster_type_failover_auth_request al cluster, richiedendo i diritti di voto (responsabile dell'elaborazione degli slot). il nodo master vota a questo nodo. 2. Il nodo master che riceve il messaggio cluster_type_failover_auth_request giudicherà se è d'accordo con il nodo slave nel diventare il nuovo nodo master in base alle proprie condizioni (l'epoca attuale del nodo di voto iniziale non è inferiore all'epoca attuale del nodo di voto ). Se è d'accordo, restituirà un messaggio cluster_type_failover_auth_ack. 3. Quando il messaggio cluster_type_failover_auth_ack viene ricevuto dal nodo, il numero di voti verrà aumentato di 1. 4. Se i voti di un nodo slave sono maggiori o uguali alla metà dei nodi master nel cluster (maggiori o uguali a N/2 1), questo nodo diventerà il nuovo nodo master. Se nessun nodo slave riceve voti sufficienti durante un ciclo di configurazione, il cluster entrerà in un nuovo ciclo di configurazione e qui si terranno le elezioni finché non verrà eletto un nuovo nodo master.
Tutti i nodi slave possono chiedere opinioni sulla possibilità di diventare il master (coloro che votano voteranno solo per i propri nodi più grandi) e più della metà di loro può essere (n 1)/2
Forse non posso scegliere
limitazioni
1. Attualmente sono supportate solo le operazioni batch di chiavi sullo stesso slot; 2. Attualmente sono supportate solo le transazioni chiave sullo stesso slot; 3. È possibile utilizzare solo il database 0 (ogni istanza redis ha 16 database, che possono essere commutati tramite il comando select {index}); 4. Una chiave grande (come hash, elenco) non può essere mappata su nodi diversi; 5. Attualmente, la replica master-slave del cluster supporta solo un livello e non supporta la struttura ad albero nidificata;
Durante l'espansione
fare un passo
1. Invia al nodo di destinazione cluster setslot {slot_index} importazione {source_node_id} 2. Invia al nodo di origine cluster setslot {slot_index} migrazione {target_node_id} 3. Esecuzione del loop del nodo sorgente cluster getkeysinslot {slot_index} {count(numero di chiavi)} 4. Il nodo di origine esegue e migra la chiave al nodo di destinazione attraverso la pipeline. migrazione {target_ip} {target_port} "" 0 {timeout} chiavi {key1} {key2} {key3} 5. Ripetere i passaggi 3 e 4 6. Invia notifiche a tutti i nodi master nel cluster cluster setslot {slot_index} nodo {target_nodeid}
Ogni nodo conosce il nodo del cluster corrispondente a ciascuno slot.
Quando il nodo riceve la richiesta di comando, chiede se può gestirla da solo, in caso affermativo, la gestisce. In caso contrario, restituisce un errore di spostamento. L'errore di spostamento trasporta l'IP del nodo corretto e il numero di porta client per guidarlo all'esecuzione. E ogni successiva operazione del client Una volta eseguita la chiave, andrà al nodo fornito dall'errore spostato.
Codis
Livello di accesso: il metodo di accesso può essere VIP o chiamare jodis tramite codice Java, quindi connettersi e chiamare diversi indirizzi proxy codis per ottenere funzioni LVS e HA ad alta disponibilità.
Livello proxy: quindi il livello intermedio utilizza codis-proxy e zookeeper per elaborare la direzione e la distribuzione dei dati. Attraverso l'algoritmo crc32, le chiavi vengono distribuite uniformemente in un determinato slot di diversi redis per ottenere uno striping simile a raid0, nella vecchia versione di codis, gli slot devono essere assegnati manualmente Dopo codis3.2, gli slot verranno assegnati automaticamente, il che è abbastanza conveniente.
Livello dati: infine, codis-proxy memorizza i dati sul vero server principale del server redis. Poiché l'autore di codis, Huang Dongxu, attribuisce grande importanza alla coerenza dei dati e non consente incoerenze dei dati causate da ritardi nei dati, l'architettura non è stata progettata. considerati dall'inizio. La lettura e la scrittura master-slave sono separate Il server slave viene utilizzato solo come architettura ridondante per il failover e zookeeper chiama redis-sentinel per implementare la funzione di failover.
In Codis, Codis dividerà tutte le chiavi in 1024 slot. Questi 1024 slot corrispondono al cluster Redis, la relazione di mappatura tra questi 1024 slot e l'istanza Redis verrà mantenuta in memoria. Questo slot è configurabile e può essere impostato su 2048 o 4096. Dipende da quanti nodi ha il tuo Redis. Se sono troppi, puoi impostare più slot.
Quando il Dashbord Codis di Codis modifica le informazioni sugli slot, altri nodi Codis monitoreranno le modifiche degli slot ZooKeeper e le sincronizzeranno nel tempo. Come mostrato nell'immagine:
zk è responsabile della sincronizzazione delle informazioni sugli slot.
coda prioritaria
insieme ordinato
elenco
Utilizza più code per implementare code con priorità. Attività con priorità diversa entrano in code diverse
Allo stesso tempo, quando i consumatori recuperano i dati dalla coda, supportano il recupero dei dati da più code, con ordine di priorità.
bloccato
Avviare più consumatori significa avviare più client per recuperare i dati.
coda di messaggi
pubsub
utilizzo
Gli abbonati possono iscriversi a uno, più argomenti di iscrizione corrispondenti
L'editore pubblica un determinato argomento e valore
Gli argomenti pubblicati verranno immediatamente inoltrati ai consumatori che si iscrivono all'argomento. Se non ci sono consumatori, il messaggio verrà scartato.
rischio
Esiste il rischio di perdita dei messaggi (quando la macchina non funziona, la rete è disconnessa o la rete viene interrotta e i messaggi vengono persi)
A causa di questa caratteristica, il semplice pubsub corre il rischio di perdere le risposte.
L'affidabilità dei dati non può essere garantita
Non c'è alcuna garanzia che almeno una volta
L’espansione non è flessibile e non c’è modo di accelerare i consumi aggiungendo più consumatori.
Puoi utilizzare più canali e ascoltare più volte.
elenco
elenco
1. Quando non ci sono elementi da visualizzare nell'elenco fornito, la connessione verrà bloccata dal comando BRPOP fino allo scadere del tempo di attesa o fino al rilevamento di un elemento popable. 2. Quando vengono forniti più parametri chiave, ciascun elenco viene controllato in sequenza in base alla chiave del parametro e viene visualizzato l'elemento di coda del primo elenco non vuoto. Inoltre, BRPOP si comporta allo stesso modo di BLPOP ad eccezione della posizione dell'elemento pop-up.
Se non sono presenti attività nell'elenco, la connessione verrà bloccata È previsto un timeout per il blocco della connessione. Quando il timeout è impostato su 0, è possibile attendere in modalità wireless finché non viene visualizzato un messaggio.
Utilizzando pubsub, puoi anche avvisare i consumatori che possono consumare dall'elenco.
È adatto per l'abbonamento e la pubblicazione tra due aziende tra A e B. È più difficile quando più linee di business significano consumatori diversi.
ack implementazione
Mantieni due code: coda in sospeso e tabella in esecuzione (tabella hash).
i lavoratori sono definiti come ThreadPool. Dopo essere stati accodati dalla coda in sospeso, i lavoratori assegnano un thread (singolo lavoratore) per elaborare il messaggio: aggiungono un timestamp corrente e il nome del thread corrente al messaggio di destinazione, lo scrivono nella tabella di lavoro e quindi il lavoratore consuma il messaggio dopo completamento Cancella da solo le informazioni nella tabella delle attività.
Abilita un'attività pianificata, scansiona la coda di esecuzione a intervalli regolari e controlla il timestamp di ogni elemento. Se scade, il ThreadPoolExecutor del lavoratore controllerà se il thread esiste. Se esiste, l'esecuzione dell'attività corrente verrà annullata e la transazione verrà ripristinato. Infine, estrai l'attività dalla coda di esecuzione e reinseriscila nella coda in sospeso.
Puoi usare zset per l'ordinamento.
Evita l'uso eccessivo di Redis. Usa Redis solo per fare le cose in cui sei migliore e per fare quelle in cui non sei bravo. Più fai, più scoprirai. Più sono le insidie, più difficile sarà rinunciare alla fine. Una progettazione sbagliata nella fase iniziale porta ad un alto tasso di fallimento nella fase successiva. Scarsa stabilità e alti costi di trasformazione, ecc. Rabbitmq non è molto complicato, anche il funzionamento e la manutenzione sono molto semplici e possono essere combinati con il sistema aziendale.