Redis
 sql >> Baza danych >  >> NoSQL >> Redis

Jakie są podstawowe struktury danych używane w Redis?

Postaram się odpowiedzieć na Twoje pytanie, ale zacznę od czegoś, co na początku może wyglądać dziwnie:jeśli nie interesują Cię elementy wewnętrzne Redis, nie powinieneś się tym przejmować o tym, jak typy danych są implementowane wewnętrznie. Dzieje się tak z prostego powodu:dla każdej operacji Redis znajdziesz złożoność czasową w dokumentacji, a jeśli masz zestaw operacji i złożoność czasową, jedyną inną rzeczą, której potrzebujesz, jest pewna wskazówka na temat wykorzystania pamięci (i ponieważ wykonujemy wiele optymalizacji, które mogą się różnić w zależności od danych, najlepszym sposobem na uzyskanie tych ostatnich danych jest wykonanie kilku trywialnych testów w świecie rzeczywistym).

Ale skoro pytasz, oto podstawowa implementacja każdego typu danych Redis.

  • Struny są implementowane przy użyciu biblioteki ciągów dynamicznych C, dzięki czemu nie płacimy (mówiąc asymptotycznie) za alokacje w operacjach dołączania. W ten sposób mamy na przykład dopisy O(N), zamiast zachowania kwadratowego.
  • Listy są zaimplementowane z połączonymi listami.
  • Zestawy i hasze są implementowane z tablicami mieszającymi.
  • Posortowane zestawy są zaimplementowane z listami pomijania (specyficzny rodzaj zrównoważonych drzew).

Ale gdy listy, zestawy i posortowane zestawy mają małą liczbę elementów i rozmiar największych wartości, używane jest inne, znacznie bardziej zwarte kodowanie. To kodowanie różni się dla różnych typów, ale ma tę cechę, że jest to kompaktowy obiekt blob danych, który często wymusza skanowanie O(N) dla każdej operacji. Ponieważ używamy tego formatu tylko dla małych obiektów, nie stanowi to problemu; skanowanie małego blobu O(N) jest nieokreślone w pamięci podręcznej więc praktycznie rzecz biorąc jest bardzo szybki, a gdy jest zbyt wiele elementów, kodowanie jest automatycznie przełączane na kodowanie natywne (lista powiązań, hash itd.).

Ale Twoje pytanie tak naprawdę nie dotyczyło tylko elementów wewnętrznych, chodziło Ci o Jakiego typu użyć, aby osiągnąć co? .

Struny

Jest to typ podstawowy wszystkich typów. Jest to jeden z czterech typów, ale jest także typem bazowym typów złożonych, ponieważ List to lista ciągów, Set to zbiór ciągów i tak dalej.

Ciąg Redis jest dobrym pomysłem we wszystkich oczywistych scenariuszach, w których chcesz przechowywać stronę HTML, ale także wtedy, gdy chcesz uniknąć konwersji już zakodowanych danych. Na przykład, jeśli masz JSON lub MessagePack, możesz po prostu przechowywać obiekty jako ciągi. W Redis 2.6 możesz nawet manipulować tego rodzaju stroną serwera obiektów za pomocą skryptów Lua.

Innym interesującym zastosowaniem ciągów są bitmapy i ogólnie tablice bajtów o swobodnym dostępie, ponieważ Redis eksportuje polecenia, aby uzyskać dostęp do losowych zakresów bajtów, a nawet pojedynczych bitów. Na przykład sprawdź ten dobry post na blogu:Szybkie i łatwe metryki w czasie rzeczywistym przy użyciu Redis.

Listy

Listy są dobre, gdy prawdopodobnie dotykasz tylko krańców listy:w pobliżu ogona lub w pobliżu głowy. Listy nie są zbyt dobre do stronicowania, ponieważ dostęp losowy jest wolny, O(N). Tak więc dobrymi zastosowaniami list są zwykłe kolejki i stosy lub przetwarzanie elementów w pętli przy użyciu RPOPLPUSH z tym samym źródłem i miejscem docelowym do "obracania" pierścienia przedmiotów.

Listy są również dobre, gdy chcemy po prostu utworzyć ograniczoną kolekcję N elementów, w których zazwyczaj mamy dostęp tylko do górnych lub dolnych elementów, lub gdy N jest małe.

Zestawy

Zestawy są nieuporządkowanym zbiorem danych, więc są dobre za każdym razem, gdy masz kolekcję przedmiotów i bardzo ważne jest, aby bardzo szybko sprawdzić istnienie lub rozmiar kolekcji. Kolejną fajną rzeczą w zestawach jest obsługa podglądania lub wyskakiwania losowych elementów (polecenia SRANDMEMBER i SPOP).

Zestawy są również dobre do reprezentowania relacji, np. „Kim są znajomi użytkownika X?” i tak dalej. Ale inne dobre struktury danych dla tego rodzaju rzeczy to posortowane zestawy, jak zobaczymy.

Zestawy obsługują złożone operacje, takie jak przecięcia, sumy i tak dalej, więc jest to dobra struktura danych do korzystania z Redis w sposób „obliczeniowy”, gdy masz dane i chcesz wykonać na nich przekształcenia, aby uzyskać pewne dane wyjściowe.

Małe zestawy są kodowane w bardzo wydajny sposób.

Hasze

Hasze to idealna struktura danych do reprezentowania obiektów, składająca się z pól i wartości. Pola skrótów można również zwiększać atomowo za pomocą HINCRBY. Gdy masz obiekty, takie jak użytkownicy, posty na blogu lub inny rodzaj przedmiotu , skróty są prawdopodobnie dobrym rozwiązaniem, jeśli nie chcesz używać własnego kodowania, takiego jak JSON lub podobne.

Pamiętaj jednak, że małe skróty są bardzo wydajnie kodowane przez Redis i możesz poprosić Redis o atomowe POBIERANIE, USTAWIANIE lub zwiększanie poszczególnych pól w bardzo szybki sposób.

Skróty mogą być również używane do reprezentowania połączonych struktur danych za pomocą odwołań. Na przykład sprawdź implementację komentarzy na stronie lamernews.com.

Posortowane zestawy

Posortowane zestawy to jedyne inne struktury danych, poza listami, do utrzymywania uporządkowanych elementów . Możesz zrobić wiele fajnych rzeczy z posortowanymi zestawami. Na przykład możesz mieć wszystkie rodzaje Najlepszego czegoś listy w Twojej aplikacji internetowej. Najlepsi użytkownicy według wyniku, najlepsze posty według odsłon, najlepsze cokolwiek, ale pojedyncza instancja Redis będzie obsługiwać mnóstwo operacji wstawiania i pobierania elementów na sekundę.

Posortowane zestawy, podobnie jak zwykłe zestawy, mogą służyć do opisu relacji, ale pozwalają też na stronicowanie listy pozycji i zapamiętanie kolejności. Na przykład, jeśli pamiętam znajomych użytkownika X z posortowanym zestawem, mogę ich łatwo zapamiętać w kolejności zaakceptowanej przyjaźni.

Posortowane zestawy są dobre dla kolejek priorytetowych.

Posortowane zestawy są jak bardziej zaawansowane listy, w których wstawianie, usuwanie lub pobieranie zakresów ze środka listy jest zawsze szybkie. Ale zużywają więcej pamięci i są strukturami danych typu O(log(N)).

Wniosek

Mam nadzieję, że podałem trochę informacji w tym poście, ale o wiele lepiej jest pobrać kod źródłowy lamernews z http://github.com/antirez/lamernews i zrozumieć, jak to działa. Wiele struktur danych z Redis jest używanych w Lamer News i istnieje wiele wskazówek dotyczących tego, czego użyć, aby rozwiązać dane zadanie.

Przepraszamy za literówki gramatyczne, jest tu północ i jestem zbyt zmęczony, by przejrzeć post;)



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Laravel + predis + klaster Redis - PRZENIESIONY / brak połączenia do 127.0.0.1:6379

  2. Skalowanie Socket.IO do wielu procesów Node.js przy użyciu klastra

  3. Node.js — Sesja nie jest zachowywana przez res.redirect()

  4. Redisson, kolejka robocza / dequeu. Strategie przetwarzania wiadomości / elementu w przypadku niekompletnej obsługi wiadomości w systemie / zamknięciu pod

  5. Jak przekonwertować istniejącą relacyjną bazę danych na magazyn klucz-wartość?