Redis ma kilka poleceń blokujących, które działają na strukturach danych listy. Polecenie LPOP służy do usunięcia elementu z głowicy danej listy. Usunie element głowy z listy i natychmiast zwróci. Usunięty element dotrze do klienta. Ilekroć na liście nie występują żadne elementy, polecenie zwróci natychmiast z wartością zerową. Jego wariant blokujący to polecenie BLPOP, które utrzyma połączenie z serwerem, gdy na liście nie występują żadne elementy. Polecenie BLPOP będzie poczekać, aż element pojawi się na liście, aby zwrócić. Dostępnych jest kilka poleceń blokujących z listami. W tym przewodniku skupimy się na poleceniu BRPOPPUSH.
Komenda Redis Brpoplpush
Polecenie BRPOPPUSH to wariant blokujący polecenie rpoplpush. Stąd polecenie BRPOPPUSH zachowuje się tak samo jak polecenie rpoplpush, gdy na liście źródłowej jest dostępnych jeden lub więcej elementów. Ilekroć żaden element nie ma na liście, polecenie BRPOPPUSH utrzymuje połączenie z serwerem Redis, dopóki element będzie dostępny na liście źródłowej.
Składnia:
BRPOPPOPHUSH SOUTORE_LIST DOCETINE_LIST TIMEOUT
Lista źródeł: Lista, z której elementy zostaną usunięte
Destination_List: Lista, w którą elementy zostaną wepchnięte
koniec czasu: Czas na zablokowanie połączenia i utrzymanie go przy życiu.
Polecenie BRPOPPOSH usunie element z ogona Lista źródeł, Pierwszy. Następnie element zostanie zepchnięty w pobliżu głowy innego Destination_list. Ilekroć źródło jest puste, utrzyma połączenie, jak pokazano następująco:
To polecenie ma stałą złożoność czasu i zostało przestrzegane z Redis w wersji 6.2.0. Zaleca się użycie Blmove polecenie z PRAWIDŁOWY I LEWY argumenty. Komenda BRPOPPUSH zwraca element wyskakujący ze źródła i wepchnięty do miejsca docelowego. Wyjście będzie wartością zerową, jeśli przekroczy się limit czasu.
Przykład - serwer wiadomości z kolejkami niezawodności
Załóżmy, że serwer przesyłania wiadomości używa kolejki niezawodności do przechowywania dziesiątek zadań w tle dla danej aplikacji. Lista po stronie serwera została użyta do przechowywania identyfikatorów każdego zadania w tle. Kilku klientów zużywa listę, pobierając zadania podstawowe z ogona.
Największą wadą tego procesu jest: jeśli istnieje sieć lub awaria aplikacji klienta, zwrócony kawałek zostanie utracony przed przetwarzaniem po stronie klienta. Stąd potrzebna jest oddzielna niezawodna kolejka do przechowywania elementu poppped z listy źródłowej, jednocześnie zwracając go klientowi. Ponadto lista źródeł może być pusta, gdy wydawcy nie wykonują żadnych zadań. Dlatego potrzebujemy sposobu, w jaki połączenie klienta będzie utrzymywane i żywe, dopóki praca w tle nie będzie dostępna na liście źródłowej. Komenda BRPOPOPHSH jest idealnym kandydatem do osiągnięcia tego.
Zadzwońmy do serwera Redis z poleceniem BRPOPPUSH, jak pokazano następująco. Nie istnieją zarówno klucze źródłowe, jak i docelowe.
BRPOPPOPHSUSK TELEJOBS_LIST REFILATYQUEUE_LIST 0
Określiliśmy argument limitu czasu na 0, co oznacza, że operacja BRPOPPUSH zostanie zablokowana na zawsze, dopóki nie zakończysz go ręcznie. Teraz czeka na co najmniej jedno zadanie w tle na liście przechowywaną na kluczu Tła jobs_list.
Następnie będziemy naciskać zadanie w tle do Tła jobs_list Lista, jak pokazano następująco. Użyjmy polecenia LPUSH, aby wypchnąć pojedyncze zadanie tła z identyfikatorem „B1".
Zgodnie z oczekiwaniami element „B1” został zwrócony klientowi, który utrzymywał połączenie, dopóki element nie będzie dostępny na liście źródłowej Tła jobs_list. Sprawdźmy kolejkę docelową RelibleQueue_List. Tutaj używamy Lrange polecenie, jak pokazano w następujący sposób:
LRANGE RELIBLEQUEUE_LIST 0 10
Kolejka docelowa zawiera element „B1” wyskakujący z listy źródłowej. To polecenie gwarantuje, że elementy są przechowywane w innej kolejce bez utraty ich, gdy klient się zawiedzie. Komenda BRPOPPUSH może być używana jako lista okrągła, gdy zarówno źródło, jak i miejsce docelowe są takie same.
Wniosek
Podsumowując, Redis ma dziesiątki wbudowanych poleceń działających na różnych typach danych. Większość poleceń nie blokuje, w których polecenie zostanie zwrócone natychmiast po zakończeniu zadania. Jak omówiono, dostępnych jest kilka wbudowanych poleceń blokujących. Komenda BRPOPOPSH jest jednym z nich. Jak już wiesz, jest to wariant blokujący polecenie rpoplpush. Zachowuje się tak samo jak polecenie rpoplpush, gdy przynajmniej pojedynczy element jest przechowywany na liście źródłowej. Ilekroć lista źródeł nie istnieje, polecenie BRPOPPUSH będzie czekać na określony limit czasu, aż element będzie obecny na liście źródłowej. Jak wspomniano, ponieważ ma stałą złożoność czasu, bardzo wydajne w użyciu z wiarygodnymi kolejkami na serwerach przesyłania wiadomości.