2014-10-18 5 views
10

मैं नया हूँ Redis के लिए तो मैं कुछ गलत कर रहा हूँ, मुझे यकीन है:StackExchange.Redis server.Keys (पैटर्न: "IsVerySlow *")

मैं में मोटे तौर पर 16,000 कुंजी/मान संग्रहीत किया है Azure Redis।

मैं चाबियाँ लिखने के लिए निम्नलिखित का इस्तेमाल किया/महत्व देता

 foreach (var worksheet in wksList) 
     { 
     var wksYYMM = string.Format("{0}{1:00}", worksheet.ReviewDt.Year, worksheet.ReviewDt.Month); 
     var wksKey = string.Format("{0}:{1}:{2}", provCode, wksYYMM, worksheet.AcctNbr); 
     string jsonStr = JsonConvert.SerializeObject(MakeWsListDto(worksheet, provCoderList, rvrList)); 
     cache.StringSet(wksKey, jsonStr); 
     } 

तो मेरी चाबियाँ इस तरह दिखेगा: "एपी: 201,401: AZ5798BK":

जब मैं की तरह एक देखने की कोशिश

var keys = server.Keys(pattern: "AP:201401:*"); // returns in milliseconds 
    var keyAry = keys.ToArray(); // returns in over one minute 
    (note: this returns 12 keys) 

कुंजी को वापस करने में 1 मिनट 12 सेकंड लगते हैं। एक बार जब मेरे पास चाबियाँ हों तो उनको मान प्राप्त करने के लिए मिलीसेकंड लगते हैं। यदि मैं चाबियों के मूल्य पर पुन: प्रयास करता हूं और मान वापस करता हूं तो मुझे एक समान परिणाम मिलता है। मैंने समस्या को अलग करने के लिए ToArray() किया था।

यदि मैं redis-cli.exe में एक ही क्वेरी का प्रयास करता हूं तो यह मिलीसेकंड में वापस आता है।

क्या मैं इस आदेश का गलत इस्तेमाल कर रहा हूं?

उत्तर

15

server.Keys स्वचालित रूप से KEYS और वरीय SCAN सर्वर संस्करण के आधार पर के बीच चयन करता है। मुझे संदेह है कि क्या हो रहा है यह है कि आप इस प्रकार SCAN का उपयोग बहुत छोटे पृष्ठ के आकार के साथ कर रहे हैं। पेज आकार के लिए एक वैकल्पिक पैरामीटर है। डिफ़ॉल्ट से कुछ बड़ा निर्दिष्ट करने का प्रयास करें - सैकड़ों, हजारों, आदि। यदि निर्दिष्ट नहीं है, तो पृष्ठ-आकार 10 के रेडिस SCAN डिफ़ॉल्ट का उपयोग करता है, जो बहुत सारे राउंड-ट्रिप की आवश्यकता हो सकती है।

+0

धन्यवाद मार्क मैं इसे आज़मा दूंगा और आपको बता दूंगा कि यह कैसा चल रहा था। यह समझा सकता है कि redis-cli.exe इतना तेज़ क्यों है। – Weej

+1

मार्क! हाँ वह जवाब था। एक फॉलो-अप प्रश्न: मैंने थोड़ा ऑप्टिमाइज़ेशन परीक्षण किया और पाया कि मुझे 2000 के माध्यम से पृष्ठों के आकार के साथ प्रदर्शन में वृद्धि जारी रही है, हालांकि यह लगभग 1650 के आसपास है। उस बिंदु पर यह लगभग 180 मिलीसेकंड पर बंद हो गया था। दो प्रश्न: क्या पेजिज़ ऑप्टिमाइज़ेशन डीबी आकार या कीबाइज का एक फ़ंक्शन है? दूसरा प्रश्न: क्लाइंट या सर्वर पर पेजसाइज के लिए स्मृति आवंटन होता है? आपके उत्तर के लिए बहुत बहुत धन्यवाद! – Weej

+0

इससे मुझे 'सर्वर.केस' के साथ एक समान प्रदर्शन समस्या हल करने में मदद मिली। धन्यवाद! – G0dsquad

6

KEYS का उपयोग न करें - यह एक अवरोधक कमांड है जो आपके Redis सर्वर को चलने के दौरान अन्य अनुरोधों के लिए अनुपलब्ध करेगा। command's documentation से हवाला देते हुए:

चेतावनी: एक आदेश है कि केवल अत्यधिक सावधानी से उत्पादन वातावरण में इस्तेमाल किया जाना चाहिए के रूप में KEYS पर विचार करें। यह बड़े डेटाबेस के खिलाफ निष्पादित होने पर प्रदर्शन प्रदर्शन को बर्बाद कर सकता है। यह आदेश है जो डिबगिंग और विशेष संचालन के लिए है, जैसे कि आपके कीस्पेस लेआउट को बदलना। अपने नियमित एप्लिकेशन कोड में KEYS का उपयोग न करें। यदि आप हैं तो अपने कुंजीपटल के उप-समूह में कुंजी खोजने के लिए एक तरीका ढूंढ रहे हैं, तो SCAN या सेट का उपयोग करके पर विचार करें।

आप अच्छी तरह से चेतावनी पढ़ा, तो आप अर्थात् SCAN या Redis 'सेट का उपयोग कर पैरा, के अंत में सिफारिश की दृष्टिकोण पर ध्यान देंगे। एससीएएन गैर-अवरुद्ध है लेकिन चूंकि आपका प्रश्न बताता है कि आप प्रदर्शन में हैं, मैं सेट का उपयोग करने की सलाह देता हूं।

विचार एक Redis कि कि "पैटर्न" के साथ जुड़े रहे सभी प्रमुख नामों के साथ सेट बनाए रखने के लिए है, तो आपके उदाहरण में आप cache.SetString करने के लिए अपने कॉल, जैसे के बाद SADD AP:201401 AP:201401:AZ5798BK की StackExchange.Redis-बराबर करना है है:

cache.SetAdd(wksYYMM, wksKey); 

अस्वीकरण: मैं एक सी # प्रोग्रामर नहीं हूँ और न ही मैं भी StackExchange.Redis से परिचित हूँ (खेद मार्क;))

अब, KEYS के बजाय या अपनी चाबी पाने के लिए स्कैन, बस करो SMEMBERS AP:201401 या शायद:

var keys = cache.Members(wksYYMM); 

बोनस: के बाद से आप वास्तव में इन चाबियों का मान में रुचि रखते हैं, तो आप सेट के सदस्यों के आधार पर कुंजी मूल्यों लाने के लिए Redis 'लुआ पटकथा का उपयोग कर सकते हैं, या बस SORT का उपयोग करें।

शुद्ध Redis:

SORT AP:201401 BY nosort GET *` 

सी # & StackExchange.Redis:

vals = cache.Sort(wksYYMM, by = "nosort", get = "*"); 
+2

सर्वर। उपलब्ध होने पर वास्तव में स्कैन स्वचालित रूप से SCAN का उपयोग करता है। अलग जवाब पर अधिक जानकारी। –

+0

आह, बहुत चालाक :) –

+0

मैं कार्यान्वयन से बहुत खुश हूं, मुझे स्वीकार करना होगा। जैसा कि आप डेटा के माध्यम से काम करते हैं, उतना ही अनुक्रमिक अनुक्रम आपको स्क्रॉल/पृष्ठों को स्वचालित रूप से वापस ले जाता है। –

संबंधित मुद्दे