Redis में नाम लंबाई प्रभाव प्रदर्शन करता है?


129

मैं उदाहरण के लिए, रेडिस में वर्बोज़ नामों का उपयोग करना पसंद करता हूं set-allBooksBelongToUser:$userId

क्या यह ठीक है या यह प्रदर्शन को प्रभावित करता है?

जवाबों:


198

आप जिस कुंजी का उपयोग करने की बात कर रहे हैं वह वास्तव में लंबे समय तक नहीं है।

उदाहरण कुंजी जो आप देते हैं वह सेट, लुकअप विधियों O (1) के लिए है। एक सेट पर अधिक जटिल ऑपरेशन (SDIFF, SUNION, SINTER) O (N) हैं। संभावना है कि आबादी हो$userId एक लंबी कुंजी का उपयोग करने की तुलना में अधिक महंगा ऑपरेशन थी।

Redis एक बेंचमार्क उपयोगिता के साथ आता है redis-benchmark, जिसे यदि आप src / redis-benchmark.c में "GET" परीक्षा को संशोधित करते हैं, ताकि वे कुंजी सिर्फ "foo" हो, आप एक के बाद लघु कुंजी परीक्षण चला सकते हैं 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);

यहां लघु कुंजी "फू" के 3 बाद के रन के लिए GET परीक्षण गति है:

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

यहाँ स्रोत को फिर से संशोधित करने और "सेट-ऑलबुकबेलटॉउजर: 1234567890" की कुंजी बदलने के बाद यहां जीईटी परीक्षा की गति है:

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

कुंजी के लिए एक बार फिर बदलना "ipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumlorem: 1234567890" इस देता है:

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

तो वास्तव में वास्तव में लंबी चाबियाँ रेडिस की गति पर एक बड़ा प्रभाव नहीं है। और यह GET, O (1) ऑपरेशन पर है। अधिक जटिल ऑपरेशन इसके प्रति कम संवेदनशील होंगे।

मुझे लगता है कि ऐसी कुंजियाँ हैं जो स्पष्ट रूप से पहचानती हैं कि वे कौन से मूल्यों को रखती हैं जो किसी भी छोटी गति के प्रदर्शन से आगे निकल जाते हैं जिसे आप संक्षिप्त कुंजियों से बाहर निकालेंगे।

यदि आप इसे आगे ले जाना चाहते हैं, तो -r [keyspacelen]रेडिस-बेंचमार्क उपयोगिता पर एक पैरामीटर भी है जो इसे यादृच्छिक कुंजी (जब तक उनके पास ': रैंड:' है) बनाने की सुविधा देता है, तो आप सिर्फ उपसर्ग का आकार बढ़ा सकते हैं परीक्षण कोड जो भी आप चाहते थे लंबाई।


6
इसके बारे में कितनी जगह लेता है? अगर मेरे पास इनमें से 1 मिलियन लंबी चाबियां हैं, तो क्या यह मेमोरी में बहुत बड़ी होगी या डिस्क पर बनी रहेगी?
डेरेक ऑर्गन

9
@ डेरेक ऑर्गन येप, यह निश्चित रूप से ली गई मेमोरी को प्रभावित करेगा, इसलिए यदि आपकी चाबियां आपके द्वारा संग्रहित की जा रही चीज़ों का एक महत्वपूर्ण हिस्सा हैं और आप मेमोरी सीमाओं में चल रहे हैं, तो आप कम वर्बोज़ बनना चाह सकते हैं। मुझे लगता है कि आपको अंतरिक्ष विचारों के साथ प्रयोज्य को संतुलित करने की आवश्यकता है। संपूर्ण लुकअप समय कुंजियों के साथ अधिक लंबा नहीं है, लेकिन जगह ले ली जाएगी।
टेड नेलिड

हम आम तौर पर कम से कम महत्वपूर्ण लंबाई का उपयोग करते हैं और हमारे डोमेन ऑब्जेक्ट्स और उनके तरीकों के लिए "पठनीयता" को स्थानांतरित करते हैं। हम सीधे रेडिस में रखरखाव और निरीक्षण में मदद करने के लिए अपनी चाबियों में छोटे नामस्थानों का भी उपयोग करते हैं।
xentek

26

Redis को मेमोरी में सभी कीज़ रखना पसंद है। आपकी औसत लंबाई जितनी लंबी होगी, स्मृति में कम रखा जा सकता है। तो हां, कुंजी की लंबाई प्रदर्शन को बहुत प्रभावित कर सकती है लेकिन संभवतः उस तरीके से महत्वपूर्ण नहीं है जिस तरह से आप चिंतित हैं। अर्थात्, एक छोटे से कीस्पेस (जैसे कि एक मेमोरी में आसानी से फिट होने वाला) के साथ, एक 128 बाइट कुंजी और एक 16 बाइट कुंजी नाटकीय रूप से अलग तरीके से प्रदर्शन नहीं करेगी।


4
Redis एक ऑल-इन-मेमोरी स्टोर की परिभाषा है, इसलिए पहला वाक्य मेरे लिए हैरान करने वाला है।
ली ग्रिसॉम

5
@bmatheny, अगर मैं आपकी क्वेरी को सही ढंग से समझता हूं, तो रेडिस मूल रूप से एक इन-मेमोरी स्टोर है, और यह दृढ़ता का समर्थन भी करता है
नजीब

5

मैं किसी भी निश्चितता के साथ इस सवाल का जवाब नहीं दे सकता। हालांकि, मैं इसके बारे में कुछ सवाल पूछ सकता हूं और कुछ टिप्पणियों की पेशकश कर सकता हूं।

मुझे लगता है कि यह स्पष्ट है कि अत्यंत लंबी कुंजियों (नाम) और / या मानों का समग्र प्रदर्शन पर प्रदर्शन प्रभाव पड़ेगा यदि उनका उपयोग किया जा सकता है। ये प्रभाव क्लाइंट में, नेटवर्क पर या सर्वर पर हो सकते हैं। तो आपका पहला सवाल यह होगा कि:

Redis और आपके ग्राहकों के बीच कुंजियाँ और मूल्य कब तक हो सकते हैं?

Redis पर खोज , मुख्य लंबाई और सीमाएं मुझे Redis बनाम मेम्केड पर एक दिलचस्प ब्लॉग प्रविष्टि प्रदान करती हैं जो आपके प्रश्न का उत्तर देना शुरू कर सकती हैं। उस ब्लॉग प्रविष्टि के लिए पहली प्रतिक्रिया रेडिस के निर्माता सल्वाटोर सैंफिलिपो (प्रारंभिक अंतिम गिरावट: 09/2010) द्वारा लिखी गई प्रतीत होती है कि यह सुझाव देता है कि एक अधिक हालिया संस्करण काफी बेहतर परिणाम दिखाएगा। उस से नीचे दो टिप्पणियाँ हमें Salvatore के लिए लिंक रेडिस / मेम्नेच्ड बेंचमार्क से जोड़ती हैं जो कुछ दिन पोस्ट किया गया था के बाद वह मूल "blagger" (जो गुमनाम हो रहा है) के लिए प्रतिक्रिया व्यक्त था।

यह सवालों के जवाब नहीं देता है (कुंजियां कब तक और किन बिंदुओं पर प्रदर्शन पर पता लगाने योग्य प्रभाव पड़ सकती हैं)। हालांकि, यह हमें प्रश्न के दृष्टिकोण के बारे में एक सुराग देता है।

इन दोनों लेखों के लेखकों ने कोड लिखे और इसका परीक्षण किया ... और परिणामों को रेखांकन किया।

हम सभी तरह के अनुमान लगा सकते थे। हम कोड को देख सकते हैं और इसका कारण जानने की कोशिश कर सकते हैं।

हालांकि, इस तरह के एक प्रश्न के दृष्टिकोण के लिए सबसे सार्थक तरीका एक प्रस्तावित उपयोग पैटर्न को मापने के लिए कुछ कोड लिखना है ... और कुछ और परीक्षण करने के लिए (उदाहरण के लिए 8 वर्णों से लेकर प्रमुख लंबाई की एक श्रृंखला ... कैसे कब तक आप चाहेंगे ... 8 किलोबाइट?) ... और इसे मापें।


-7

मुझे नहीं लगता कि चर नाम की लंबाई प्रदर्शन को प्रभावित करेगी, चर एक ही स्थान लेगा क्योंकि कोई भी चर उस डेटाटाइप के लिए ले जाएगा जहां तक ​​आप अधिकतम नाम लंबाई से अधिक नहीं हैं।


6
चार्ली: ये वास्तव में "चर" नहीं हैं वे चाबियाँ हैं। 1 और 30 या 100 के बीच कुंजियों के लिए, या यहां तक ​​कि 255 वर्णों में कोई भी पता लगाने योग्य प्रदर्शन प्रभाव नहीं हो सकता है। कुछ किलोबाइट की कुंजी बनाएँ ... या किलोबाइट के दसियों में और मुझे लगता है कि आप एक प्रदर्शन हिट को मापने में सक्षम होंगे (1K और 70K के बीच कुछ बिंदु पर आप कुंजी आकार से एडिटोनल नेटवर्क ओवरहेड मारेंगे। आपके MTU और डेटा को कई पैकेटों पर तोड़ना होगा ... बहुत कम से कम टीसीपी और फिर से ओवरहेड ओवरहेड करना)।
जिम डेनिस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.