Örneğin Redis'te ayrıntılı isimler kullanmayı seviyorum set-allBooksBelongToUser:$userId
.
Bu tamam mı yoksa performansı etkiliyor mu?
Örneğin Redis'te ayrıntılı isimler kullanmayı seviyorum set-allBooksBelongToUser:$userId
.
Bu tamam mı yoksa performansı etkiliyor mu?
Yanıtlar:
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 $userId
daha 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.
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.
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.
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.