Jaki jest sens wielu baz danych Redis?

159

Tak więc doszedłem do miejsca, w którym chciałem podzielić dane, które przechowuję w redis na oddzielne bazy danych, ponieważ czasami potrzebuję użyć polecenia kluczy na jednym konkretnym rodzaju danych i chciałem je oddzielić, aby to przyspieszyć .

Jeśli podzielę się na wiele baz danych, wszystko jest nadal jednowątkowe, a nadal mogę używać tylko jednego rdzenia. Jeśli po prostu uruchomię inną instancję Redis na tym samym pudełku, będę mógł użyć dodatkowego rdzenia. Poza tym nie mogę nazwać baz danych Redis ani nadać im żadnego bardziej logicznego identyfikatora. Biorąc to wszystko pod uwagę, dlaczego / kiedy miałbym kiedykolwiek chcieć używać wielu baz danych Redis zamiast po prostu uruchamiać dodatkową instancję Redis dla każdej dodatkowej bazy danych, którą chcę? I w związku z tym, dlaczego Redis nie próbuje wykorzystać dodatkowego rdzenia dla każdej dodatkowej bazy danych, którą dodam? Jaka jest zaleta bycia jednowątkowym między bazami danych?

Eli
źródło
w aplikacji Node.js zrób to ---> module.exports = {"1": "twoja nazwa dla redis db one", "2": "twoja nazwa dla redis db dwa", "3": "twoja name for redis db three "} etc, lub przełącz klucze i wartości, cokolwiek potrzebujesz
Alexander Mills,
1
W Redis 2.8.0 i nowszych zaleca się użycie opcji SCAN zamiast KEYS, ponieważ wykonuje iterację po niewielkiej liczbie elementów naraz (nie blokując serwera przez długi czas).
TryHarder

Odpowiedzi:

85

Zasadniczo bazy danych Redis w tej samej instancji nie różnią się od schematów w instancjach baz danych RDBMS.

Biorąc to wszystko pod uwagę, dlaczego / kiedy miałbym kiedykolwiek chcieć używać wielu baz danych Redis zamiast po prostu uruchamiać dodatkową instancję Redis dla każdej dodatkowej bazy danych, którą chcę?

Istnieje jedna wyraźna zaleta korzystania z baz danych redis w tej samej instancji redis, a jest nią zarządzanie. Jeśli uruchomisz osobną instancję dla każdej aplikacji i załóżmy, że masz 3 aplikacje, to 3 oddzielne instancje redis, z których każda prawdopodobnie będzie potrzebować urządzenia podrzędnego dla HA w środowisku produkcyjnym, więc daje to łącznie 6 instancji. Z punktu widzenia zarządzania, robi się to bardzo szybko bałaganiarskie, ponieważ musisz monitorować je wszystkie, wykonywać aktualizacje / poprawki itp. Jeśli nie planujesz przeciążania redis wysokimi I / O, pojedyncza instancja z slave jest prostsza i łatwiejsze w zarządzaniu, pod warunkiem że spełnia warunki umowy SLA.

rafian
źródło
25
Wiele instancji Redis jest zawsze najlepszym rozwiązaniem. Kropka. Uruchom równoległe zapytania dla różnych danych. Jeśli twój potok CICD nie tworzy dla ciebie klastrów pamięci podręcznej, napraw go, a nie .....
Rozumiesz
3
Nie dotyczy to punktów PO: (1) dlaczego Redis nie próbuje wykorzystać dodatkowego rdzenia dla każdej dodatkowej bazy danych? (2) Jaka jest zaleta bycia jednowątkowym między bazami danych?
żyje
93

Nie chcesz używać wielu baz danych w jednej instancji Redis. Jest przestarzały i, jak zauważyłeś, wiele wystąpień pozwala korzystać z wielu rdzeni. Jeśli korzystasz z wyboru bazy danych, będziesz musiał dokonać refaktoryzacji podczas aktualizacji. Monitorowanie i zarządzanie wieloma instancjami nie jest trudne ani bolesne.

Rzeczywiście, uzyskasz znacznie lepsze wskaźniki dla każdej bazy danych poprzez segregację na podstawie instancji. Każdy przypadek miałby statystyki odzwierciedlające ten segment danych, co może pozwolić na lepsze dostrojenie oraz bardziej responsywne i dokładne monitorowanie. Użyj najnowszej wersji i oddziel dane według instancji.

Jak powiedział Jonaton, nie używaj polecenia keys. O wiele lepszą wydajność znajdziesz, jeśli po prostu utworzysz indeks klucza. Dodając klucz, dodaj nazwę klucza do zestawu. Polecenie keys nie jest zbyt przydatne po zwiększeniu skali, ponieważ powrót zajmie dużo czasu.

Pozwól, aby wzorzec dostępu określił, jak uporządkować dane, zamiast przechowywać je w sposób, w jaki myślisz, że działa, a następnie pracuj nad tym, jak uzyskać do nich dostęp i później. Zobaczysz znacznie lepszą wydajność, a kod zużywający dane często jest znacznie czystszy i prostszy.

Jeśli chodzi o pojedyncze wątki, weź pod uwagę, że redis jest zaprojektowany z myślą o szybkości i atomowości. Pewne akcje modyfikujące dane w jednej bazie danych nie muszą czekać na inną bazę danych, ale co, jeśli ta akcja polega na zapisaniu do pliku zrzutu lub przetwarzaniu transakcji na urządzeniach podrzędnych? W tym momencie zaczynasz wpadać w chwasty programowania współbieżności.

Używając wielu instancji, zmieniasz złożoność wielowątkowości w prostszy system stylu przekazywania wiadomości.

Prawdziwy rachunek
źródło
57
Używanie wielu baz danych jest przestarzałe? Czy możesz podać odniesienie do tego oświadczenia? Zdaję sobie sprawę, że wiele baz danych nie jest obsługiwanych w klastrze Redis, ale nie ma też żadnych złożonych poleceń z wieloma klawiszami i nie są one przestarzałe.
ostergaard
27
Pewne (mocne) dowody od „właściciela” Redis (według Google Code), że „… bazy danych nie zostaną wycofane, nawet gdybym w przeszłości stwierdził, że tak będzie”.
Kenny Evitt
3
Nie będzie można użyć więcej niż jednej bazy danych redis w klastrze redis. Poza tym wiele baz danych nadal będzie miało znaczenie.
coredump
26
-1 dla nieaktualnej instrukcji. Wiele baz danych może być odradzanych i nieobsługiwanych w klastrze redis, ale nie są one przestarzałe.
AgDude
1
@ the-real-bill Jak można „utworzyć indeks kluczy”?
Kees de Kooter
57

Nawet Salvatore Sanfilippo (twórca Redis) uważa, że ​​używanie wielu baz danych w Redis jest złym pomysłem. Zobacz jego komentarz tutaj:

https://groups.google.com/d/topic/redis-db/vS5wX8X4Cjg/discussion

Rozumiem, jak to może być przydatne, ale niestety uważam, że wiele błędów bazy danych Redis jest moją najgorszą decyzją w projektowaniu Redis ... bez żadnego realnego zysku, sprawia, że ​​wewnętrzne elementy są znacznie bardziej złożone. W rzeczywistości bazy danych nie skalują się dobrze z wielu powodów, takich jak aktywne wygaśnięcie kluczy i maszyn wirtualnych. Jeśli wybór bazy danych można przeprowadzić za pomocą ciągu znaków, widzę, że ta funkcja jest używana jako skalowalna warstwa słownika O (1), zamiast tego tak nie jest.

Dzięki numerom DB, z domyślną liczbą kilku DB, lepiej komunikujemy się, czym jest ta funkcja i jak myślę, jak można ją wykorzystać. Mam nadzieję, że w pewnym momencie uda nam się w ogóle zrezygnować z obsługi wielu baz danych, ale myślę, że jest prawdopodobnie za późno, ponieważ wiele osób polega na tej funkcji w swojej pracy.

Nirmal
źródło
4
Zaczekaj, więc użycie wyboru bazy danych jest w rzeczywistości mniej wydajne niż zwykłe użycie prefiksu? Czy to właśnie oznacza to zdanie (czy mógłby ktoś wyjaśnić)? „Jeśli wyboru bazy danych można dokonać za pomocą ciągu znaków, widzę, że ta funkcja jest używana jako skalowalna warstwa słownika O (1), ale zamiast tego tak nie jest”.
dvtan
8
  1. Naprawdę nie znam żadnych korzyści z posiadania wielu baz danych w jednym wystąpieniu. Myślę, że jest to przydatne, jeśli wiele usług korzysta z tego samego serwera (ów) bazy danych, aby uniknąć kolizji kluczy.

  2. Nie polecałbym budowania za pomocą KEYSpolecenia, ponieważ jest to O (n) i nie jest dobrze skalowane. Do czego go używasz, co możesz osiągnąć w inny sposób? Może redis nie jest dla Ciebie najlepszym rozwiązaniem, jeśli tak KEYSważna jest funkcjonalność .

  3. Myślę, że wspominają o zaletach serwera jednowątkowego w swoich często zadawanych pytaniach, ale najważniejsza jest prostota - nie musisz się martwić o współbieżność w żaden rzeczywisty sposób. Każda akcja blokuje, więc żadne dwie rzeczy nie mogą zmienić bazy danych w tym samym czasie. Idealnie byłoby, gdybyś miał jedną (lub więcej) instancji na rdzeń każdego serwera i używał spójnego algorytmu mieszającego (lub serwera proxy) do dzielenia kluczy między nimi. Oczywiście stracisz część funkcjonalności - orurowanie będzie działać tylko dla rzeczy na tym samym serwerze, sortowanie stanie się trudniejsze itp.

Jonatan Hedborg
źródło
W odpowiedzi na 2: używam polecenia keys tylko wtedy, gdy potrzebuję wszystkich kluczy. Używam go w ten sam sposób, w jaki używa się hgetall. Obie są O (n). Klucze są złe, jeśli chcesz przeszukać ogromny zestaw kluczy dla jakiegoś wyrażenia regularnego, ale jest całkowicie w porządku, jeśli musisz wykonać jakąś operację na wszystkich kluczach w jakiejś bazie danych. W odpowiedzi na 3: Rozumiem zalety pojedynczego wątku w jednej bazie danych. Nie rozumiem tego w wielu bazach danych, ponieważ akcja na jednej bazie danych nigdy nie musi blokować akcji na innej bazie danych AFAIK.
Eli
3

Używam redis do implementacji czarnej listy adresów e-mail i mam różne wartości TTL dla różnych poziomów czarnej listy, więc posiadanie różnych baz danych w tej samej instancji bardzo mi pomaga.

kommradHomer
źródło
1
Mamy teraz ten sam problem - chcemy zdefiniować różne zasady LRU dla różnych części naszych danych. czy możesz podzielić się, jak to wdrożyłeś?
user2717436
@ user2717436 Nie jestem pewien, czy to, co robię, jest związane z twoim, ale używam różnych baz danych jako różnych zestawów, zawsze ustawiając TTL kluczy, kiedy je wkładam. tak jak istnieje czarna lista A na redis.get (1), i za każdym razem, gdy ustawiam tam klucz, ustawiam termin ważności na 5000. i jest czarna lista B na redis.get (2) i za każdym razem, gdy ustawię tam klucz,
ustawię jego
2

Bazy danych Redis mogą być używane w rzadkich przypadkach wdrażania nowej wersji aplikacji, gdzie nowa wersja wymaga pracy z różnymi jednostkami.

Shlomi
źródło
1

Korzystanie z wielu baz danych w jednym wystąpieniu może być przydatne w następującym scenariuszu:

Różne kopie tej samej bazy danych mogą być używane do produkcji, programowania lub testowania przy użyciu danych w czasie rzeczywistym. Użytkownicy mogą używać repliki do klonowania instancji redis, aby osiągnąć ten sam cel. Jednak poprzednie podejście jest łatwiejsze dla istniejących uruchomionych programów, ponieważ wystarczy wybrać odpowiednią bazę danych, aby przełączyć się do zamierzonego trybu.

yoonghm
źródło
1

Wiem, że to pytanie ma lata, ale jest jeszcze jeden powód, dla którego wiele baz danych może być przydatnych.

Jeśli korzystasz z „chmury Redis” od swojego ulubionego dostawcy usług w chmurze, prawdopodobnie masz minimalną wielkość pamięci i zapłacisz za to, co przydzielisz. Jeśli jednak Twój zbiór danych jest mniejszy, zmarnujesz trochę alokacji, a tym samym stracisz trochę pieniędzy.

Korzystając z baz danych, możesz użyć tej samej instancji chmury Redis do świadczenia usług (powiedzmy) dla deweloperów, UAT i produkcji lub wielu wystąpień aplikacji lub czegokolwiek innego - w ten sposób wykorzystując więcej przydzielonej pamięci i przez to trochę drożej. efektywny.

Przypadek użycia, na który patrzę, ma kilka wystąpień aplikacji, które używają 200-300 KB, ale minimalna alokacja u mojego dostawcy chmury wynosi 1 MB. Możemy skonsolidować 10 instancji w pojedynczym Redisie bez rzeczywistego robienia żadnych ograniczeń, a więc zaoszczędzić około 90% kosztów hostingu Redis. Doceniam ograniczenia i problemy z tym podejściem, ale pomyślałem, że warto o tym wspomnieć.

Ralph Bolton
źródło