Ad uzunluğu, Redis'teki performansı etkiler mi?


129

Örneğin Redis'te ayrıntılı isimler kullanmayı seviyorum set-allBooksBelongToUser:$userId.

Bu tamam mı yoksa performansı etkiliyor mu?

Yanıtlar:


198

Kullanmaktan bahsettiğiniz anahtar aslında o kadar uzun değil.

Verdiğiniz örnek anahtar küme içindir, küme arama yöntemleri O (1). Bir kümedeki (TMSF, SUNION, SINTER) daha karmaşık işlemler O (N) 'dir. Şanslar, doldurmanın $userIddaha uzun bir anahtar kullanmaktan daha pahalı bir işlemdi.

Redis redis-benchmark, src / redis-benchmark.c dosyasındaki "GET" testini anahtar yalnızca "foo" olacak şekilde değiştirirseniz, kısa anahtar testini aşağıdakilerden sonra çalıştırabilirsiniz 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);

İşte "foo" kısa anahtarının ardışık 3 çalışması için GET test hızı:

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

Kaynağı tekrar değiştirdikten ve anahtarı "set-allBooksBelongToUser: 1234567890" olarak değiştirdikten sonra GET test hızı:

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

Anahtarı bir kez daha "ipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreips90

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

Bu yüzden gerçekten çok uzun tuşların bile redis hızı üzerinde büyük bir etkisi yoktur. Ve bu GET, bir O (1) işlemi. Daha karmaşık işlemler buna karşı daha da az duyarlı olacaktır.

Bence, hangi değerlere sahip olduklarını açıkça tanımlayan anahtarlara sahip olmak, kısaltılmış anahtarlardan elde edeceğiniz küçük hız performanslarından daha ağır basar.

Bunu daha da ileri götürmek isterseniz -r [keyspacelen], redis-benchmark yardımcı programında rastgele anahtarlar oluşturmasına izin veren bir parametre de vardır (içlerinde ': rand:' olduğu sürece), sadece önekin boyutunu artırabilirsiniz. kodu istediğiniz uzunlukta test edin.


6
ne kadar yer kaplar? Bu gerçekten uzun anahtarlardan 1 milyonuna sahipsem, bellekte çok daha büyük olacak mı yoksa diskte kalıcı mı kalacak?
Derek Organ

9
@Derek Organ, evet, kullanılan hafızayı kesinlikle etkiler, bu yüzden anahtarlarınız sakladığınız şeyin önemli bir kısmıysa ve hafıza sınırlamalarıyla karşılaşıyorsanız, daha az ayrıntılı olmak isteyebilirsiniz. Kullanılabilirliği alanla ilgili hususlarla dengelemeniz gerektiğini düşünüyorum. Genel arama süresi tuşlarla önemli ölçüde uzun değildir, ancak kaplanan alan olacaktır.
Ted Naleid

Genellikle mümkün olan en kısa anahtar uzunluklarını kullanırız ve "okunabilirliği" etki alanı nesnelerimize ve bunların yöntemlerine taşırız. Doğrudan redis'te bakım ve incelemeye yardımcı olmak için anahtarlarımızda kısa ad alanları da kullanıyoruz.
xentek

26

Redis, tüm anahtarları bellekte tutmayı sever. Ortalama anahtar uzunluğunuz ne kadar uzunsa, bellekte o kadar az tutulabilir. Yani evet, anahtar uzunluğu performansı büyük ölçüde etkileyebilir, ancak muhtemelen sizin ilgilendiğiniz şekilde önemli ölçüde olmayacaktır. Yani, küçük bir anahtar alanıyla (örneğin, belleğe kolayca sığan), 128 baytlık bir anahtar ve 16 baytlık bir anahtar önemli ölçüde farklı performans göstermeyecektir.


4
Redis tanımı gereği bir hepsi bellek deposu, bu yüzden ilk cümle kafamı karıştırıyor.
Lee Grissom

5
@bmatheny, sorgunuzu doğru anlarsam, Redis temelde bir bellek içi depodur ve kalıcılığı da destekler
Najeeb

5

Bu soruya kesin olarak cevap veremem. Ancak bununla ilgili bazı sorular sorabilir ve bazı gözlemler sunabilirim.

Son derece uzun anahtarların (adların) ve / veya değerlerin, eğer kullanılabilirlerse, genel performans üzerinde bir performans etkisinin olacağı aşikardır. Bu etkiler istemcide, ağ üzerinden veya sunucuda olabilir. Öyleyse, sizinkinden çıkacak ilk soru şudur:

Redis ve müşterileriniz arasında anahtarlar ve değerler ne kadar sürebilir?

Redis , anahtar uzunluğu ve sınırlar üzerinde arama yapmak, Redis ve memcached ile ilgili sorunuzu yanıtlamaya başlayabilecek ilginç bir blog girişi sağlıyor. Bu blog girişine verilen ilk yanıt, Redis'in yaratıcısı Salvatore Sanfilipo tarafından yazılmış gibi görünüyor (geçen sonbaharın başı: 09/2010), daha yeni bir sürümün önemli ölçüde daha iyi sonuçlar göstereceğini öne sürüyor. Bundan iki yorum bizi Salvatore'un orijinal "blagger" a (isimsiz gibi görünen) yanıt vermesinden birkaç gün sonra yayınlanan Redis / memcached Benchmark'a bağladı.

Bu soruları yanıtlamaz (anahtarlar ne kadar uzun olabilir ve performans üzerinde hangi noktalarda algılanabilir etkiler vardır). Ancak, soruya yaklaşım konusunda bize bir ipucu veriyor.

Bu iki makalenin yazarları kod yazdılar ve test ettiler ... ve sonuçların grafiğini çıkardılar.

Her türlü tahminde bulunabiliriz. Koda bakabilir ve gerekçelendirmeye çalışabiliriz.

Bununla birlikte, bu tür bir soruyu ele almanın en anlamlı yolu, önerilen bir kullanım modelini ölçmek için bir kod yazmak ... ve bir başkasını test etmek için biraz daha kod yazmaktır (örneğin, 8 karakter ile ... nasıl arasında değişen bir anahtar uzunluğu aralığı) uzun ister misiniz ... 8 kilobayt?) ... ve ölçün.


-7

Değişken adının uzunluğunun performansı etkileyeceğini düşünmüyorum, maksimum ad uzunluğunu aşmadığınız sürece değişken o veri türü için alacağı herhangi bir değişkenle aynı yerde olacaktır.


6
Charlie: bunlar gerçekten "değişkenler" değil, anahtarlar. 1 ile 30 veya 100 veya hatta 255 karakter arasındaki anahtarlar için, herhangi bir algılanabilir performans etkisi olmayabilir. Birkaç kilobaytlık anahtarlar oluşturun ... veya onlarca kilobayte kadar anahtarlar oluşturun ve performans isabetini ölçebileceğinizi tahmin ediyorum (1K ile 70K arasında bir noktada anahtar boyutu olacağından ek ağ ek yüküne çarpacaksınız. MTU'nuzu aşarsanız, verilerin birden çok pakete bölünmesi gerekir ... en azından TCP ve yeniden birleştirme ek yüküne neden olur).
Jim Dennis
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.