Czy długość nazwy wpływa na wydajność w Redis?

130

Na przykład lubię używać pełnych nazw w Redis set-allBooksBelongToUser:$userId.

Czy to jest w porządku, czy ma to wpływ na wydajność?

Running Turtle
źródło

Odpowiedzi:

200

Klucz, o którym mówisz, nie jest tak długi.

Przykładowy klucz, który podasz, dotyczy zestawu, metody wyszukiwania zestawów to O (1). Bardziej złożone operacje na zbiorze (SDIFF, SUNION, SINTER) to O (N). Są szanse, że zapełnienie $userIdbyło droższą operacją niż użycie dłuższego klucza.

Redis jest dostarczany z narzędziem testującym o nazwie redis-benchmark, jeśli zmodyfikujesz test „GET” w src / redis-benchmark.c, tak aby klucz był tylko „foo”, możesz uruchomić krótki test klawisza po make install:

diff --git a/src/redis-benchmark.c b/src/redis-benchmark.c
--- a/src/redis-benchmark.c
+++ b/src/redis-benchmark.c
@@ -475,11 +475,11 @@
         benchmark("MSET (10 keys)",cmd,len);
         free(cmd);

-        len = redisFormatCommand(&cmd,"SET foo:rand:000000000000 %s",data);
+        len = redisFormatCommand(&cmd,"SET foo %s",data);
         benchmark("SET",cmd,len);
         free(cmd);

-        len = redisFormatCommand(&cmd,"GET foo:rand:000000000000");
+        len = redisFormatCommand(&cmd,"GET foo");
         benchmark("GET",cmd,len);
         free(cmd);

Oto prędkość testowa GET dla 3 kolejnych uruchomień skrótu klawiszowego „foo”:

59880.24 requests per second
58139.53 requests per second
58479.53 requests per second

Oto szybkość testu GET po ponownej modyfikacji źródła i zmianie klucza na „set-allBooksBelongToUser: 1234567890”:

60240.96 requests per second
60606.06 requests per second
58479.53 requests per second

Zmiana klucza jeszcze raz do „ipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumlorem: 1234567890” daje to:

58479.53 requests per second
58139.53 requests per second
56179.77 requests per second

Więc nawet naprawdę długie klawisze nie mają dużego wpływu na szybkość redis. A to jest na GET, operacja O (1). Bardziej złożone operacje byłyby na to jeszcze mniej wrażliwe.

Myślę, że posiadanie kluczy, które jasno identyfikują, jakie wartości mają, znacznie przewyższa jakąkolwiek minimalną prędkość, jaką można uzyskać dzięki skrótom klawiszowym.

Jeśli chcesz -r [keyspacelen]pójść dalej, w narzędziu redis-benchmark istnieje również parametr, który pozwala tworzyć losowe klucze (o ile mają w sobie ': rand:'), możesz po prostu zwiększyć rozmiar przedrostka w testowanie kodu do dowolnej długości.

Ted Naleid
źródło
6
a co z tym, ile zajmuje miejsca? jeśli mam 1 milion tych naprawdę długich kluczy, to czy będzie to o wiele większe w pamięci, czy pozostanie na dysku?
Derek Organ
9
@Derek Organ tak, zdecydowanie wpłynęłoby to na ilość zajmowanej pamięci, więc jeśli twoje klucze stanowią znaczną część tego, co przechowujesz i masz ograniczenia pamięci, możesz chcieć być mniej szczegółowym. Myślę, że musisz zrównoważyć użyteczność z kwestiami dotyczącymi przestrzeni. Całkowity czas wyszukiwania nie jest znacznie dłuższy w przypadku kluczy, ale zajmowane miejsce byłoby.
Ted Naleid
Zwykle używamy najkrótszych możliwych długości kluczy i przenosimy „czytelność” na nasze obiekty domeny i ich metody. Używamy również krótkich przestrzeni nazw w naszych kluczach, aby pomóc bezpośrednio w konserwacji i inspekcji w Redis.
xentek
28

Redis lubi trzymać wszystkie klucze w pamięci. Im dłuższa jest średnia długość klucza, tym mniej może być przechowywanych w pamięci. Więc tak, długość klucza może znacznie wpłynąć na wydajność, ale prawdopodobnie nie znacząco w sposób, w jaki jesteś zaniepokojony. Oznacza to, że przy małej przestrzeni klawiszy (np. Takiej, która łatwo mieści się w pamięci), klucz 128-bajtowy i klucz 16-bajtowy nie będą działać dramatycznie inaczej.

bmatheny
źródło
4
Redis jest z definicji magazynem typu all-in-memory, więc pierwsze zdanie jest dla mnie kłopotliwe.
Lee Grissom
5
@bmatheny, jeśli dobrze rozumiem twoje zapytanie, Redis jest zasadniczo magazynem w pamięci, a także obsługuje trwałość
Najeeb
5

Nie mogę odpowiedzieć na to pytanie z całą pewnością. Mogę jednak zadać kilka pytań na ten temat i przedstawić kilka uwag.

Myślę, że jest oczywiste, że ekstremalnie długie klucze (nazwy) i / lub wartości miałyby wpływ na ogólną wydajność, jeśli w ogóle można ich użyć. Wpływy te mogą mieć miejsce w kliencie, w sieci lub na serwerze. Więc pierwsze pytanie, które należy wyciągnąć z twojego, brzmiałoby:

Jak długo mogą znajdować się klucze i wartości między Redis a Twoimi klientami?

Wyszukiwanie w Redis , długość klucza i limity daje mi interesujący wpis na blogu na temat Redis vs. memcached, który może zacząć odpowiadać na twoje pytanie. Wydaje się, że pierwsza odpowiedź na ten wpis na blogu została napisana przez Salvatore Sanfilipo, twórcę Redis (początek jesieni ubiegłego roku: 09/2010), sugerując, że nowsza wersja przyniosłaby znacznie lepsze wyniki. Dwa komentarze w dół od tego łącza prowadzą do Benchmark Salvatore'a Redis / memcached, który został opublikowany kilka dni po tym, jak odpowiedział na oryginalnego „blagger” (który wydaje się być anonimowy).

To nie odpowiada na pytania (jak długie mogą być klucze i w których momentach można wykryć wpływ na wydajność). Daje nam jednak wskazówkę dotyczącą podejścia do pytania.

Autorzy obu artykułów napisali kod i przetestowali go ... i przedstawili na wykresie wyniki.

Moglibyśmy zgadywać na różne sposoby. Moglibyśmy spojrzeć na kod i spróbować to wyjaśnić.

Jednak najbardziej sensownym sposobem podejścia do tego rodzaju kwestii jest napisanie kodu, który mierzy jeden proponowany wzorzec użycia ... i kilka innych, aby przetestować inny (na przykład zakres długości kluczy od 8 znaków do ... jak długo chcesz ... 8 kilobajtów?) ... i zmierzyć to.

Jim Dennis
źródło
-7

Nie sądzę, aby długość nazwy zmiennej wpłynęła na wydajność, zmienna zajmie to samo miejsce, co każda zmienna dla tego typu danych, o ile nie przekroczysz maksymalnej długości nazwy.

kocham informatykę
źródło
6
Charlie: to nie są tak naprawdę „zmienne”, ale klucze. W przypadku kluczy od 1 do 30 lub 100, a nawet 255 znaków może nie wystąpić żaden wykrywalny wpływ na wydajność. Utwórz klucze o wielkości kilku kilobajtów ... lub nawet do kilkudziesięciu kilobajtów i wyobrażam sobie, że byłbyś w stanie zmierzyć wpływ wydajności (w pewnym momencie między 1K a 70K będziesz osiągać dodatkowe obciążenie sieci, ponieważ rozmiar klucza będzie przekroczyć swoje MTU, a dane będą musiały zostać podzielone na wiele pakietów ... co najmniej obciążając TCP i ponowny montaż).
Jim Dennis