Jakie są podstawowe struktury danych wykorzystywane w Redis?

Staram się odpowiedzieć na dwa pytania w ostatecznej liście:

  1. Jakie są podstawowe struktury danych wykorzystywane do Redis?
  2. a jakie są główne zalety/wady/przypadki użycia dla każdego typu?

Czytałem, że listy Redis są faktycznie zaimplementowane z listami linkowanymi. Ale dla innych typów, nie jestem w stanie wykopać żadnych informacji. Ponadto, gdyby ktoś natknął się na to pytanie i nie miał wysokiego podsumowania plusów i minusów modyfikacji lub uzyskawszy dostęp do różnych struktur danych, mieliby pełną listę , kiedy najlepiej użyć określonych typów do odniesienia.

W szczególności chcę przedstawić wszystkie typy: string, list, set, zset i hash.

Oh, patrzyłem na ten artykuł m.in. do tej pory:

Author: lucapette, 2012-03-09

3 answers

Spróbuję odpowiedzieć na twoje pytanie, ale zacznę od czegoś, co na początku może wyglądać dziwnie: jeśli nie jesteś zainteresowany wewnętrznymi systemami Redis, nie powinieneś dbać o to, 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 wskazówka o wykorzystaniu pamięci (a ponieważ robimy wiele optymalizacji to może się różnić w zależności od danych, najlepszym sposobem, aby uzyskać te ostatnie dane są robi kilka trywialnych testów świata rzeczywistego).

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

  • ciągi {[2] } są zaimplementowane przy użyciu dynamicznej biblioteki ciągów C, dzięki czemu nie płacimy (asymptotycznie mówiąc) za alokacje w operacjach dołączania. W ten sposób mamy np. O (N), zamiast zachowania kwadratowego.
  • Listy są zaimplementowane z listami połączonymi.
  • Zestawy i Hasze są zaimplementowane z tabelami haszującymi.
  • sortowane zbiory są zaimplementowane z pomiń listy (specyficzny typ zrównoważonych drzew).

Ale gdy listy, zbiory i sortowane zbiory są małe pod względem liczby elementów i wielkości największych wartości, używane jest inne, znacznie bardziej kompaktowe kodowanie. Kodowanie to różni się dla różnych typów, ale ma tę cechę, że jest to zwarta blob danych, które często wymusza skanowanie O (N) dla każdej operacji. Ponieważ używamy tego formatu tylko dla małych obiektów, nie jest to problemem; skanowanie małej O (N) blob jest Cache nieświadomy 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 linkowanych, hash itp.).

Ale twoje pytanie nie było tak naprawdę tylko o wewnętrzne, chodziło Ci jakiego typu użyć, aby osiągnąć co?.

Struny

Jest to typ bazowy wszystkich typów. Jest to jeden z czterech typów, ale jest także podstawowym typem typów złożonych, ponieważ lista jest listą ciągów, zbiór jest zbiorem ciągów itd.

Łańcuch 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. Więc na przykład, jeśli masz JSON lub MessagePack, możesz po prostu przechowywać obiekty jako struny. W Redis 2.6 można nawet manipulować tego typu obiektami po stronie serwera za pomocą skryptów Lua.

Innym interesującym zastosowaniem łańcuchów jest bitmapy i ogólnie tablice dostępu losowego bajtów, 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 łatwe pomiary w czasie rzeczywistym za pomocą Redis .

Listy

Listy są dobre, gdy możesz dotknąć tylko skrajności listy: blisko ogona lub blisko głowy. Listy nie są zbyt dobre do paginowania rzeczy, ponieważ dostęp losowy jest powolny, O (N). Tak więc dobre zastosowania list to zwykłe kolejki i stosy, lub przetwarzanie elementów w pętli za pomocą RPOPLPUSH z tym samym źródłem i miejscem docelowym, aby "obrócić" pierścień elementów.

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

Zestawy

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

Zestawy są również dobre do reprezentowania relacji, np. " kim są przyjaciele użytkownika X?"i tak dalej. Ale inne dobre struktury danych dla tego rodzaju rzeczy są sortowane zestawy, jak zobaczymy.

Zestawy obsługują złożone operacje takie jak przecięcia, związki itd., więc jest to dobra struktura danych do korzystania z Redis w sposób "obliczeniowy", gdy masz Dane i chcesz wykonać transformacje na tych danych, aby uzyskać pewne wyjście.

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

Hashes

Hasze są idealną strukturą danych do reprezentowania obiektów, składającą się z pól i wartości. Pola hashów mogą być również atomicznie zwiększane za pomocą HINCRBY. Gdy masz obiekty takie jak użytkownicy, posty na blogu lub inny rodzaj , hasze 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ą kodowane bardzo efektywnie przez Redis i możesz poprosić Redis, aby atomicznie pobierał, ustawiał lub zwiększał poszczególne pola w bardzo szybki sposób.

Hasze mogą być również używane do reprezentowania powiązanych struktur danych, za pomocą odniesień. Na przykład sprawdź lamernews.com realizacja komentarze.

Sortowane Zestawy

Sortowane zbiory to tylko 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 List Top Something w swojej aplikacji internetowej. Najlepsi użytkownicy według wyników, najlepsze posty według przeglądów stron, najlepsze cokolwiek, ale pojedyncza instancja Redis będzie obsługiwać Tony operacji wstawiania i pobierania najlepszych elementów na sekundę.

Sortowane zbiory, jak zwykłe zestawy, mogą być używane do opisywania relacji, ale pozwalają również na pogrupowanie listy elementów i zapamiętanie kolejności. Na przykład, jeśli pamiętam znajomych użytkownika X z posortowanym zestawem mogę łatwo zapamiętać je w kolejności zaakceptowanej przyjaźni.

Sortowane zestawy są dobre dla kolejek priorytetowych.

Sortowane zestawy są jak potężniejsze listy, gdzie wstawianie, usuwanie lub pobieranie zakresów ze środka listy jest zawsze szybkie. Ale zużywają więcej pamięci i są o(log (N)) dane struktury.

Podsumowanie

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 na temat tego, czego użyć, aby rozwiązać dane zadanie.

Przepraszam za literówki gramatyczne, jest północ tutaj i zbyt zmęczony, aby przejrzeć post ;)

 575
Author: antirez,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-04 19:39:45

Przez większość czasu nie musisz rozumieć podstawowych struktur danych używanych przez Redis. Ale odrobina wiedzy pomaga w wymianie pamięci CPU v / s. Pomaga również modelować dane w efektywny sposób.

Wewnętrznie Redis wykorzystuje następujące struktury danych:

  1. String
  2. Słownik
  3. Lista Podwójnie Połączona
  4. Pomiń Listę
  5. Lista Zip
  6. Int Sets
  7. Mapy Zip (przestarzałe na rzecz listy zip od Redis 2.6)

Aby znaleźć kodowanie używane przez dany klucz, użyj polecenia object encoding <key>.

1. Stringi

W Redis, ciągi są nazywane proste dynamiczne ciągi, lub SDS . Jest to mała owijka nad char *, która pozwala zapisać Długość łańcucha i liczbę wolnych bajtów jako prefiks.

Ponieważ długość łańcucha jest przechowywana, strlen jest operacją O(1). Ponadto, ponieważ długość jest znana, ciągi Redis są bezpieczne binarnie. Jest całkowicie legalne, aby łańcuch zawierał znak null .

Ciągi są najbardziej wszechstronną strukturą danych dostępną w Redis. Ciąg jest Wszystkie Z NASTĘPUJĄCYCH:

  1. ciąg znaków, który może przechowywać tekst. Zobacz SETi GET.
  2. tablica bajtów, która może przechowywać dane binarne.
  3. a long, które mogą przechowywać liczby. Zobacz INCR, DECR, INCRBY i DECRBY polecenia.
  4. an Array (of chars, ints, longs lub innego typu danych), które mogą umożliwić efektywny dostęp losowy. Zobacz SETRANGEI GETRANGE polecenia.
  5. tablica bitów , która pozwala ustawić lub pobrać poszczególne bity. Zobacz polecenia SETBITi GETBIT.
  6. blok pamięci, który można wykorzystać do budowy innych struktur danych. Jest to używane wewnętrznie do budowania ziplists i intsets, które są kompaktowymi, wydajnymi pamięcią danymi konstrukcje dla małej liczby elementów. Więcej na ten temat poniżej.

2. Słownik

Redis używa słownika dla następujących:

  1. mapowanie klucza do powiązanej z nim wartości, gdzie wartością może być łańcuch, hash, set, sorted set lub list.
  2. mapowanie klucza do znacznika czasu jego wygaśnięcia.
  3. aby zaimplementować Hash, Set i posortowane typy danych Set.
  4. mapowanie poleceń Redis do funkcji obsługujących te polecenia.
  5. aby mapować Redis klucz do listy klientów, którzy są zablokowani na tym kluczu. Zobacz BLPOP .
Słowniki Redis są zaimplementowane przy użyciu tabel skrótów . Zamiast wyjaśniać implementację, wyjaśnię tylko konkretne rzeczy Redis:
  1. Słowniki używają struktury o nazwie dictType, Aby rozszerzyć zachowanie tabeli hash. Struktura ta ma Wskaźniki funkcji, a więc następujące operacje są rozszerzalne: a) funkcja hash, b) porównanie kluczy, C) Klucz Destruktor, oraz D) Destruktor wartości.
  2. Słowniki używają murmurhash2 . (Wcześniej używali djb2 funkcja hash, Z seed=5381, ale potem funkcja hash została zamieniona na murmur2. Zobacz to pytanie, aby uzyskać wyjaśnienie algorytmu haszującego djb2 .)
  3. Redis używa hashowania przyrostowego, znanego również jako przyrostowa Zmiana rozmiaru . Słownik posiada dwie tabele hash. Za każdym razem gdy słownik jest dotknięty , jeden bucket jest przenoszony z pierwszej (mniejszej) tabeli hash do drugiej. W ten sposób Redis zapobiega kosztownej operacji zmiany rozmiaru.

Struktura danych Set używa słownika, aby zagwarantować, że nie ma duplikatów. Sorted Set używa słownika do mapowania elementu do jego wyniku, dlategoZSCORE jest operacją O(1).

3. Listy Podwójnie Połączone

Typ danych list jest zaimplementowany przy użyciuPodwójnie połączonych list . Realizacja Redis jest prosto z podręcznika algorytmu. Jedyną zmianą jest to, że Redis przechowuje długość w strukturze danych listy. Zapewnia to, że LLEN ma złożoność O(1).

4. Pomiń Listy

Redis używa Pomiń listy jako podstawowej struktury danych dla sortowanych zbiorów. Wikipedia ma dobre wprowadzenie. W artykule Williama Pugha Pomiń listy: probabilistyczna alternatywa dla zrównoważonych drzew zawiera więcej szczegółów.

Sortowane Zestawy używają zarówno listy przeskoków, jak i Słownik. Słownik przechowuje wynik każdego elementu.

Implementacja listy pominięć Redis różni się od standardowej implementacji w następujący sposób:

  1. Redis pozwala na duplikowanie wyników. Jeśli dwa węzły mają ten sam wynik, są one sortowane według porządku leksykograficznego.
  2. każdy węzeł ma wskaźnik wstecz na poziomie 0. Pozwala to na przesuwanie elementów w odwrotnej kolejności partytury.

5. Lista Zip

Lista Zip jest podobnie jak podwójnie połączona lista, z tą różnicą, że nie używa wskaźników i przechowuje dane w linii.

Każdy węzeł na podwójnie połączonej liście ma po 3 wskaźniki - jeden wskaźnik do przodu, jeden wskaźnik do tyłu i jeden wskaźnik do odwoływania się do danych przechowywanych w tym węźle. Wskaźniki wymagają pamięci (8 bajtów w systemie 64-bitowym), więc w przypadku małych list podwójnie połączona lista jest bardzo nieefektywna.

Lista Zip przechowuje elementy sekwencyjnie w łańcuchu Redis. Każdy element ma mały nagłówek, który przechowuje długość i typ danych elementu, przesunięcie do następnego elementu i przesunięcie do poprzedniego elementu. Te przesunięcia zastępują wskaźniki do przodu i do tyłu. Ponieważ dane są przechowywane w linii, nie potrzebujemy wskaźnika danych.

Lista Zip służy do przechowywania małych list, posortowanych zestawów i skrótów. Posortowane zestawy są spłaszczane do listy typu [element1, score1, element2, score2, element3, score3] i przechowywane na liście Zip. Hasze są spłaszczane do listy typu [key1, value1, key2, value2] itd.

Z listy Zip masz moc, aby kompromis między procesorem a pamięcią. Listy Zip są wydajne w pamięci, ale używają więcej procesora niż lista połączona(lub Lista skrótów / pominięć). Znajdowanie elementu na liście zip to O (n). Wstawianie nowego elementu wymaga ponownego przydzielenia pamięci. Z tego powodu Redis używa tego kodowania tylko dla małych list, skrótów i posortowanych zestawów. Możesz dostosować to zachowanie, zmieniając wartości <datatype>-max-ziplist-entries i <datatype>-max-ziplist-value> w redis.conf. Zobacz Optymalizacja pamięci Redis, sekcja " specjalne kodowanie małych zagregowanych danych typy " aby uzyskać więcej informacji.

Komentarze do ziplist.c są doskonałe i możesz zrozumieć tę strukturę danych całkowicie bez konieczności czytania kodu.

6. Int Sets

Zestawy Int są wymyślną nazwą dla "posortowanych tablic całkowitych".

W Redis, zestawy są zwykle implementowane przy użyciu tabel skrótów. W przypadku małych zestawów tabela hash jest nieefektywna pod względem pamięci. Gdy zbiór składa się tylko z liczb całkowitych, tablica jest często bardziej wydajny.

Zbiór Int jest posortowaną tablicą liczb całkowitych. Aby znaleźć element używany jest binarny algorytm wyszukiwania . Ma złożoność O (log N). Dodawanie nowych liczb całkowitych do tej tablicy może wymagać realokacji pamięci, co może stać się kosztowne dla dużych tablic całkowitych.

W celu dalszej optymalizacji pamięci, Zestawy Int występują w 3 wariantach o różnych rozmiarach: 16 bitów, 32 bitów i 64 bitów. Redis jest na tyle inteligentny, aby użyć odpowiedniego wariantu w zależności od wielkości żywioły. Gdy nowy element zostanie dodany i przekroczy bieżący rozmiar, Redis automatycznie przeniesie go do następnego rozmiaru. Jeśli zostanie dodany ciąg znaków, Redis automatycznie konwertuje zestaw Int na zwykły zestaw oparty na tabeli Hash.

Zestawy Int to kompromis między procesorem a pamięcią. Zestawy Int są niezwykle wydajne w pamięci, a dla małych zestawów są szybsze niż tabela hash. Ale po pewnej liczbie elementów, o (log N) czas pobierania i koszt realokacji pamięci stają się zbyt much. Na podstawie eksperymentów ustalono, że optymalny próg przejścia na zwykłą tabelę haszującą wynosi 512. Możesz jednak zwiększyć ten próg (zmniejszenie tego nie ma sensu) w zależności od potrzeb Twojej aplikacji. Zobacz {[14] } w redis.conf.

7. Mapy Zip

Mapy Zip to słowniki spłaszczone i przechowywane na liście. Są bardzo podobne do list Zip.

Mapy Zip są przestarzałe od Redis 2.6, A małe skróty są przechowywane na listach Zip. Aby dowiedzieć się więcej informacje na temat tego kodowania można znaleźć w komentarzach w zipmap.c .

 76
Author: Sripathi Krishnan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:10:45

Redis przechowuje klucze wskazujące na wartości. Klucze mogą być dowolnymi wartościami binarnymi do rozsądnego rozmiaru (użycie krótkich łańcuchów ASCII jest zalecane do celów czytelności i debugowania). Wartości są jednym z pięciu natywnych typów danych Redis.

1.strings-ciąg binarnych bezpiecznych bajtów do 512 MB

2.hashes-zbiór par wartości klucza

3.lists-an in-insertion-order collection of strings

4.zestawy-kolekcja unikalnych sznurków bez zamawianie

5.sortowane zbiory-zbiór unikalnych ciągów uporządkowanych według zdefiniowanej przez użytkownika punktacji

Stringi

Łańcuch Redis jest sekwencją bajtów.

Łańcuchy w Redis są bezpieczne binarnie (co oznacza, że mają znaną długość, która nie jest określona przez żadne specjalne znaki kończące), więc możesz przechowywać wszystko do 512 megabajtów w jednym łańcuchu.

Ciągi są kannoniczną koncepcją "przechowuj wartość klucza". Masz klucz wskazujący na wartość, gdzie oba klucz i wartość są ciągami tekstowymi lub binarnymi.

Dla wszystkich możliwych operacji na łańcuchach, zobacz http://redis.io/commands/#string

Hashes

Skrót Redis jest zbiorem par wartości klucza.

Skrót Redis zawiera wiele par wartości klucza, gdzie każdy klucz i wartość jest ciągiem znaków. Skróty Redis nie obsługują bezpośrednio złożonych wartości (co oznacza, że pole hash nie może mieć wartości listy, zestawu lub innego skrótu), ale można użyć pól hash, aby wskaż inne złożone wartości najwyższego poziomu. Jedyną specjalną operacją, którą można wykonać na wartościach pola hash, jest przyrost atomowy / dekrement zawartości liczbowej.

Można myśleć o skrócie Redis na dwa sposoby: jako bezpośredniej reprezentacji obiektu i jako sposób na przechowywanie wielu małych wartości w kompaktowy sposób.

Bezpośrednie reprezentacje obiektów są proste do zrozumienia. Obiekty mają nazwę (klucz hash) oraz zbiór kluczy wewnętrznych z wartościami. Zobacz poniższy przykład dla przykład.

Przechowywanie wielu małych wartości za pomocą skrótu jest sprytną techniką Redis massive data storage. Gdy hash ma niewielką liczbę pól (~100), Redis optymalizuje wydajność przechowywania i dostępu całego hasha. Optymalizacja małych skrótów Redis podnosi interesujące zachowanie: wydajniej jest mieć 100 skrótów z 100 wewnętrznymi kluczami i wartościami, a nie mieć 10 000 klawiszy najwyższego poziomu wskazujących na wartości łańcuchowe. Korzystanie z skrótów Redis w celu optymalizacji przechowywania danych to sposób wymaga dodatkowego narzutu programowania do śledzenia, gdzie dane kończą się, ale jeśli przechowywanie danych jest zasadniczo oparte na ciągach, można zaoszczędzić wiele narzutu pamięci za pomocą tej jednej dziwnej sztuczki.

Wszystkie możliwe operacje na hashach można znaleźć w docs hash

Listy

Listy Redis działają jak listy połączone.

Możesz wstawiać, usuwać i przesuwać listy z głowy lub ogona listy.

Użyj List, gdy potrzebujesz zachowaj wartości w kolejności, w jakiej zostały wstawione. (Redis daje możliwość wstawienia w dowolnej pozycji listy, jeśli zajdzie taka potrzeba, ale wydajność wstawiania spadnie, jeśli wstawisz daleko od pozycji początkowej.)

Listy Redis są często używane jako kolejki producentów/konsumentów. Wstaw elementy do listy, a następnie pop elementy z listy. Co się stanie, jeśli konsumenci spróbują wyskoczyć z listy bez elementów? Możesz poprosić Redisa, aby poczekał na pojawienie się elementu i zwrócił go tobie natychmiast po dodaniu. Zmienia to Redis w kolejkę komunikatów/Zdarzenie/zadanie/Zadanie/System powiadomień w czasie rzeczywistym.

Można atomicznie usunąć elementy z każdego końca listy, umożliwiając traktowanie każdej listy jako stosu lub kolejki.

Możesz również utrzymywać listy o stałej długości (ograniczone Kolekcje), przycinając listę do określonego rozmiaru po każdym wstawianiu.

Wszystkie możliwe operacje na listach, zobacz listy docs

Zestawy

Zestawy Redis to, cóż, zestawy.

Zestaw Redis zawiera unikalne, nieuporządkowane ciągi Redis, w których każdy ciąg istnieje tylko raz na zestaw. Jeśli dodasz ten sam element dziesięć razy do zestawu, pojawi się on tylko raz. Zestawy są świetne do leniwego upewniania się, że coś istnieje przynajmniej raz, bez martwienia się o powielanie elementów gromadzących się i marnujących miejsce. Możesz dodać ten sam ciąg tyle razy, ile chcesz, bez konieczności sprawdzania, czy już istnieje.

Zestawy są szybkie do sprawdzania, wstawiania i usuwania członków w zestawie.

Zestawy mają wydajne operacje set, jak można się spodziewać. Możesz wziąć związek, przecięcie i różnicę wielu zestawów na raz. Wyniki mogą być zwrócone do wywołującego lub mogą być zapisane w nowym zestawie do późniejszego użycia.

Zestawy mają stały czas dostępu do kontroli członkostwa( w przeciwieństwie do list), a Redis ma nawet wygodne losowe usuwanie i zwracanie członków ("pop losowy element z zestawu") lub losowy członek powracający bez wymiany ("give me 30 random-ish unique users") lub z zamianą ("give me 7 cards, but after every selection, put the card back so it potencjalnie mogą być próbkowane ponownie").

Dla wszystkich możliwych operacji na zestawach, zobacz Sets docs .

Sortowane Zestawy

Redis sortowane zestawy są zestawami z kolejnością zdefiniowaną przez użytkownika.

Dla uproszczenia można myśleć o posortowanym zbiorze jako drzewo binarne z unikalnymi elementami. (Redis sortowane zbiory są w rzeczywistości pomiń listy.) Kolejność sortowania elementów jest określona przez wynik każdego elementu.

Sortowane zestawy są nadal zestawami. Elementy mogą pojawić się tylko raz w zestawie. Element, dla celów unikalności, jest definiowany przez jego zawartość ciągu znaków. Wstawienie elementu "apple" z wynikiem sortowania 3, a następnie wstawienie elementu "apple" z wynikiem sortowania 500 daje w jednym elemencie" apple " z wynikiem sortowania 500 w Twoim sortowanym zestawie. Zestawy są tylko unikalne na podstawie danych, a nie na podstawie (wynik, dane) par.

Upewnij się, że twój model danych opiera się na zawartości ciągu znaków, a nie na wyniku elementu dla unikalności. Wyniki mogą być powtarzane (lub nawet zerowe), ale po raz ostatni elementy zestawu mogą istnieć tylko raz na posortowany zestaw. Na przykład, jeśli spróbujesz zapisać historię każdego logowania użytkownika jako posortowany zestaw, czyniąc wynik epoką logowania i wartością ID użytkownika, będziesz przechowywać tylko ostatnią epokę logowania dla wszystkich Twoich użytkowników. Twój zestaw urosnie do rozmiaru twojej bazy użytkowników , a nie pożądanego rozmiaru loginów*.

Elementy są dodawane do zestawu z wynikami. Możesz zaktualizować wynik dowolnego elementu w dowolnym momencie, po prostu dodaj element ponownie z nowym wynikiem. Wyniki są reprezentowane przez podwojenia zmiennoprzecinkowe, więc w razie potrzeby można określić szczegółowość znaczników czasu o wysokiej precyzji. Wiele elementów może mieć ten sam wynik.

Elementy można pobierać na kilka różnych sposobów. Od wszystko jest posortowane, możesz poprosić o elementy zaczynając od najniższych wyników. Możesz poprosić o elementy zaczynające się od najwyższych wyników ("na odwrót"). Możesz poprosić o elementy według ich wyniku sortowania w kolejności naturalnej lub odwrotnej.

Wszystkie możliwe operacje na posortowanych zestawach, zobacz posortowane zestawy docs.

 2
Author: shrikant,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-07 15:57:11