Redis
 sql >> डेटाबेस >  >> NoSQL >> Redis

क्या REDIS में स्कैन/HSCAN कमांड के लिए COUNT का कोई अनुशंसित मान है?

डिफ़ॉल्ट मान 10 है . इसका मतलब है कि कमांड कम या ज्यादा 10 कुंजियां वापस लाएगा , कम हो सकता है यदि कुंजियाँ हैश स्लॉट में बहुत कम भरी हुई हैं, या MATCH द्वारा फ़िल्टर की गई हैं नमूना। यह अधिक हो सकता है यदि कुछ कुंजियाँ हैश स्लॉट साझा कर रही हों। वैसे भी, किया गया कार्य COUNT . के समानुपाती होता है पैरामीटर।

रेडिस सिंगल-थ्रेडेड है। कारणों में से एक SCAN एक बार में कुछ कदम चलाकर, लंबे समय तक सर्वर को ब्लॉक किए बिना सभी कुंजियों के माध्यम से जाने की अनुमति देने के लिए पेश किया गया था।

और ठीक यही मानदंड तय करने का है कि एक अच्छी संख्या क्या है। आप कब तक अवरुद्ध . करने के इच्छुक हैं? एक SCAN . चलाकर आपका Redis सर्वर आज्ञा। उच्च COUNT , ब्लॉक जितना लंबा होगा।

आइए COUNT . को समझने के लिए Lua स्क्रिप्ट का उपयोग करें प्रभाव। अपने सर्वर संसाधनों के आधार पर परिणाम प्राप्त करने के लिए अपने परिवेश पर इसका उपयोग करें।

लुआ लिपि:

local t0 = redis.call('TIME')
local res = redis.call('SCAN', ARGV[1], 'COUNT', ARGV[2])
local t1 = redis.call('TIME')
local micros = (t1[1]-t0[1])*1000000 + t1[2]-t0[2]
table.insert(res,'Time taken: '..micros..' microseconds')
table.insert(res,'T0: '..t0[1]..string.format('%06d', t0[2]))
table.insert(res,'T1: '..t1[1]..string.format('%06d', t1[2]))
return res

यहाँ हम Redis TIME . का उपयोग करते हैं आज्ञा। कमांड वापस आती है:

  • सेकंड में यूनिक्स समय
  • माइक्रोसेकंड

मेरी मशीन में कुछ रन, 1 मिलियन चाबियों के साथ:

COUNT    TIME IN MICROSECONDS
   10            37
  100           257
 1000          1685
10000         14438

ध्यान दें कि इन समयों में सॉकेट से पढ़ने और बफर करने और प्रतिक्रिया भेजने के लिए उपयोग किया जाने वाला समय शामिल नहीं है। वास्तविक समय बड़ा होगा। एक बार लगने वाला समय Redis से बाहर है, जिसमें नेटवर्क यात्रा करने में लगने वाला समय भी शामिल है, वह समय नहीं है जब आपका Redis सर्वर अवरुद्ध हो।

इस तरह मैंने लुआ स्क्रिप्ट और परिणाम को बुलाया:

> EVAL "local t0 = redis.call('TIME') \n local res = redis.call('SCAN', ARGV[1], 'COUNT', ARGV[2]) \n local t1 = redis.call('TIME') \n local micros = (t1[1]-t0[1])*1000000 + t1[2]-t0[2] \n table.insert(res,'Time taken: '..micros..' microseconds') \n table.insert(res,'T0: '..t0[1]..string.format('%06d', t0[2])) \n table.insert(res,'T1: '..t1[1]..string.format('%06d', t1[2])) \n return res" 0 0 5
1) "851968"
2) 1) "key:560785"
   2) "key:114611"
   3) "key:970983"
   4) "key:626494"
   5) "key:23865"
3) "Time taken: 36 microseconds"
4) "T0: 1580816056349600"
5) "T1: 1580816056349636"



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. रेडिस प्रतिकृति विन्यास

  2. StackExchange.Redis के साथ रेडिस के लिए एसएसएल कनेक्टिविटी

  3. क्या एकाधिक क्लाइंट रेडिस में अवरुद्ध किए बिना एक ही सूची को एक साथ एक्सेस कर सकते हैं?

  4. रेडिस डेटा को दास से मास्टर तक पुनर्स्थापित करें

  5. रेडिस सीरियलाइज़ेशन और डिसेरिएलाइज़ेशन