उत्तर दिए गए सेट में कुछ जोड़:
सबसे पहले अगर आप रेडिस हैश का कुशलतापूर्वक उपयोग करने जा रहे हैं, तो आपको अधिकतम संख्या और मानों की गणना के लिए अधिकतम आकार जानना आवश्यक है - अन्यथा यदि वे हैश-मैक्स-ज़िपलिस्ट-मूल्य या हैश-मैक्स-ज़िपलिस्ट-एंट्रीज़ को तोड़ते हैं, तो रेडिस इसे व्यावहारिक रूप से बदल देगा। एक हुड के तहत सामान्य कुंजी / मूल्य जोड़े। (हैश-मैक्स-ज़िपलिस्ट-वैल्यू, हैश-मैक्स-ज़िप्लिस्ट-एंट्रीज़ देखें) और हैश विकल्पों में से एक हुड के नीचे टूटना IS READY BAD है, क्योंकि रेडिस के अंदर प्रत्येक सामान्य कुंजी / मान जोड़ी प्रति जोड़ी +90 बाइट्स का उपयोग करती है।
इसका मतलब है कि यदि आप विकल्प दो से शुरू करते हैं और गलती से अधिकतम-हैश-ज़िपलिस्ट-मूल्य से बाहर हो जाते हैं, तो आपको प्रति उपयोगकर्ता मॉडल के अंदर +90 बाइट्स मिलेंगे! (वास्तव में +90 नहीं बल्कि +70 नीचे कंसोल आउटपुट देखें)
# you need me-redis and awesome-print gems to run exact code
redis = Redis.include(MeRedis).configure( hash_max_ziplist_value: 64, hash_max_ziplist_entries: 512 ).new
=> #<Redis client v4.0.1 for redis://127.0.0.1:6379/0>
> redis.flushdb
=> "OK"
> ap redis.info(:memory)
{
"used_memory" => "529512",
**"used_memory_human" => "517.10K"**,
....
}
=> nil
# me_set( 't:i' ... ) same as hset( 't:i/512', i % 512 ... )
# txt is some english fictionary book around 56K length,
# so we just take some random 63-symbols string from it
> redis.pipelined{ 10000.times{ |i| redis.me_set( "t:#{i}", txt[rand(50000), 63] ) } }; :done
=> :done
> ap redis.info(:memory)
{
"used_memory" => "1251944",
**"used_memory_human" => "1.19M"**, # ~ 72b per key/value
.....
}
> redis.flushdb
=> "OK"
# setting **only one value** +1 byte per hash of 512 values equal to set them all +1 byte
> redis.pipelined{ 10000.times{ |i| redis.me_set( "t:#{i}", txt[rand(50000), i % 512 == 0 ? 65 : 63] ) } }; :done
> ap redis.info(:memory)
{
"used_memory" => "1876064",
"used_memory_human" => "1.79M", # ~ 134 bytes per pair
....
}
redis.pipelined{ 10000.times{ |i| redis.set( "t:#{i}", txt[rand(50000), 65] ) } };
ap redis.info(:memory)
{
"used_memory" => "2262312",
"used_memory_human" => "2.16M", #~155 byte per pair i.e. +90 bytes
....
}
TheHippo जवाब के लिए, विकल्प एक पर टिप्पणियाँ भ्रामक हैं:
hgetall / hmset / hmget बचाव के लिए यदि आप सभी क्षेत्रों या कई मिल / सेट ऑपरेशन की जरूरत है।
BMiner जवाब के लिए।
तीसरा विकल्प वास्तव में मज़ेदार है, अधिकतम (आईडी) के साथ डेटासेट के लिए <है-मैक्स-ज़िप्लिस्ट-वैल्यू इस समाधान में ओ (एन) जटिलता है, क्योंकि, आश्चर्य की बात है, रेडीस छोटे हैश को लंबाई / कुंजी / मूल्य के सरणी-जैसे कंटेनर के रूप में संग्रहीत करता है वस्तुओं!
लेकिन कई बार हैश में सिर्फ कुछ फ़ील्ड होते हैं। जब हैश छोटे होते हैं, तो हम उन्हें केवल O (N) डेटा संरचना में एन्कोड कर सकते हैं, जैसे कि लंबाई-पूर्वसंशोधित कुंजी मान युग्मों के साथ एक रैखिक सरणी। चूँकि हम ऐसा केवल तभी करते हैं जब N छोटा होता है, HGET और HSET आदेशों के लिए परिशोधन समय अभी भी O (1) है: हैश को वास्तविक हैश तालिका में बदल दिया जाएगा जैसे ही इसमें शामिल तत्वों की संख्या बहुत अधिक बढ़ जाएगी
लेकिन आपको चिंता नहीं करनी चाहिए, आप बहुत तेजी से हैश-मैक्स-ज़िप्लिस्ट-प्रविष्टियाँ तोड़ देंगे और वहाँ आप अब आप वास्तव में समाधान नंबर 1 पर हैं।
दूसरा विकल्प एक हुड के तहत चौथे समाधान के लिए जाने की संभावना है, क्योंकि प्रश्न कहते हैं:
ध्यान रखें कि यदि मैं एक हैश का उपयोग करता हूं, तो मूल्य लंबाई अनुमानित नहीं है। वे सभी छोटे नहीं हैं जैसे कि ऊपर दिए गए जैव उदाहरण।
और जैसा कि आपने पहले ही कहा है: चौथा समाधान प्रत्येक विशेषता के प्रति सुनिश्चित करने के लिए सबसे महंगा +70 बाइट है।
मेरा सुझाव है कि ऐसे डेटासेट का अनुकूलन कैसे करें:
आपको दो विकल्प मिले हैं:
यदि आप पहले समाधान के लिए जाने की तुलना में कुछ उपयोगकर्ता विशेषताओं के अधिकतम आकार की गारंटी नहीं दे सकते हैं और यदि स्मृति मामला रेडिस में स्टोर करने से पहले उपयोगकर्ता के संक्षेपण से महत्वपूर्ण है।
यदि आप सभी विशेषताओं के अधिकतम आकार को बाध्य कर सकते हैं। थान से आप हैश-मैक्स-जिप्लिस्ट-प्रविष्टियाँ / मान सेट कर सकते हैं और हैश का उपयोग प्रति उपयोगकर्ता प्रतिनिधित्व के रूप में या एक रेडिस गाइड के इस विषय से हैश मेमोरी ऑप्टिमाइज़ेशन के रूप में कर सकते हैं: https://redis.io/topics/memory.acimization और उपयोगकर्ता को json string के रूप में स्टोर करें। किसी भी तरह से आप लंबी उपयोगकर्ता विशेषताओं को संपीड़ित कर सकते हैं।