डिफ़ॉल्ट मान 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"