Redis ha diversi comandi di blocco che operano sulle strutture dei dati dell'elenco. Il comando LPOP viene utilizzato per rimuovere un elemento dalla testa di un determinato elenco. Rimuoverà l'elemento principale dall'elenco e restituirà immediatamente. L'elemento rimosso raggiungerà il cliente. Ogni volta che non sono presenti elementi nell'elenco, il comando tornerà immediatamente con un valore nullo. La sua variante di blocco è il comando BLPOP che terrà la connessione al server ogni volta che non sono presenti elementi nell'elenco. Il comando BLPOP aspetterà fino a quando non viene visualizzato almeno un elemento nell'elenco per restituire. Ci sono diversi comandi di blocco disponibili da utilizzare con elenchi. In questa guida, ci concentreremo sul comando brpoplpush.
Comando Redis Brpoplpush
Il comando brpoplpush è la variante di blocco del comando rpoplpush. Quindi, il comando Brpoplpush si comporta come il comando rpoplpush quando uno o più elementi sono disponibili nell'elenco delle origini. Ogni volta che nessun singolo elemento è nell'elenco, il comando Brpoplpush contiene la connessione al server Redis fino a quando un elemento non è disponibile nell'elenco di origine.
Sintassi:
BRPOPLPUSH Source_List Destination_List timeout
Source_list: L'elenco da cui gli elementi verranno rimossi
Destination_list: L'elenco in cui gli elementi verranno spinti
tempo scaduto: Il tempo per bloccare la connessione e mantenerla in vita.
Il comando brpoplpush rimuoverà un elemento dalla coda del Source_list, Primo. Quindi, l'elemento verrà spinto vicino alla testa di un altro Destination_list. Ogni volta che la sorgente è vuota, manterrà la connessione come mostrato nel seguente:
Questo comando ha una complessità temporale costante ed è stato deprecato dalla versione 6 di Redis.2.0. Si consiglia di utilizzare il Blmove comando con GIUSTO E SINISTRA argomenti. Il comando brpoplpush restituisce l'elemento che viene visualizzato dalla fonte e spinto nella destinazione. L'output sarà un valore nullo se viene raggiunto il timeout.
Esempio - Server di messaggistica con code di affidabilità
Supponiamo che un server di messaggistica stia utilizzando code di affidabilità per archiviare decine di lavori di fondo per una determinata applicazione. L'elenco lato server è stato utilizzato per archiviare gli ID di ciascun lavoro in background. Diversi clienti stanno consumando l'elenco prendendo posti di lavoro dalla coda.
Il più grande svantaggio di questo processo è: se esiste una rete o il fallimento dell'applicazione client, il pezzo restituito andrà perso prima dell'elaborazione sul lato client. Pertanto, è necessaria una coda affidabile separata per archiviare l'elemento scoppiato dall'elenco di origine mentre lo restituirà al client. Inoltre, l'elenco delle fonti potrebbe essere vuoto quando non ci sono lavori di fondo prodotti dagli editori. Quindi, abbiamo bisogno di un modo in cui la connessione del cliente sarà mantenuta e viva fino a quando un lavoro di fondo sarà disponibile nell'elenco delle fonti. Il comando brpoplpush è il candidato ideale per raggiungere questo obiettivo.
Facciamo una chiamata al server Redis con il comando Brpoplpush come mostrato nel seguente. Sia le chiavi di origine che di destinazione non esistono.
brpoplpush sfondojobs_list affidabilequeue_list 0
Abbiamo specificato l'argomento timeout su 0, il che significa che l'operazione Brpoplpush verrà bloccata per sempre fino a quando non lo terminerai manualmente. Ora, sta aspettando che almeno un singolo lavoro di fondo sia disponibile nell'elenco memorizzato a chiave Backgroundjobs_list.
Successivamente, spingeremo un lavoro di fondo al Backgroundjobs_list Elenco come mostrato nel seguente. Usiamo il comando Lpush per spingere un singolo lavoro di sfondo con l'ID di "B1".
Come previsto, l'elemento "B1" è stato restituito al client che ha tenuto la connessione fino a quando un elemento non è disponibile nell'elenco di origine Backgroundjobs_list. Ispezioniamo la coda di destinazione ReflableQueue_list. Qui stiamo usando il LRANGE comando come mostrato nel seguente:
LRANGE RELABLEUEUE_LIST 0 10
La coda di destinazione contiene l'elemento "B1" che viene visualizzato dall'elenco di origine. Questo comando garantisce che gli elementi siano archiviati in un'altra coda senza perderli quando un cliente si blocca. Il comando brpoplpush può essere utilizzato come elenco circolare quando sia l'origine che la destinazione sono gli stessi.
Conclusione
Per riassumere, Redis ha decine di comandi integrati che operano su diversi tipi di dati. La maggior parte dei comandi non blocca in cui il comando verrà restituito immediatamente dopo la fine del lavoro. Come discusso, sono disponibili diversi comandi di blocco integrati per operare sui tipi di elenco. Il comando brpoplpush è uno di questi. Come già sai, è la variante di blocco del comando rpoplpush. Si comporta uguale al comando rpoplpush quando almeno un singolo elemento viene archiviato nell'elenco di origine. Ogni volta che l'elenco di origine non esiste, il comando brpoplpush attende un timeout specificato fino a quando un elemento non sarà presente nell'elenco delle origini. Come affermato, poiché ha una complessità temporale costante, molto efficiente da utilizzare con code affidabili nei server di messaggistica.