প্রদত্ত উত্তরের একটি সেটটিতে কিছু সংযোজন:
সবার আগে আপনি যদি রেডিস হ্যাশকে দক্ষতার সাথে ব্যবহার করতে চান তবে আপনাকে অবশ্যই একটি কী গণনা সর্বোচ্চ নম্বর এবং সর্বাধিক আকারের মানগুলি জানতে হবে - অন্যথায় যদি তারা হ্যাশ-সর্বোচ্চ-জিপলিস্ট-মান বা হ্যাশ-ম্যাক্স-জিপলিস্ট-এন্ট্রিগুলি ছড়িয়ে দেয় তবে রেডিস এটিকে ব্যবহারিকভাবে রূপান্তরিত করবে একটি হুডের নীচে সাধারণ কী / মান জোড়া। (হ্যাশ-সর্বোচ্চ-জিপলিস্ট-মান, হ্যাশ-ম্যাক্স-জিপলিস্ট-এন্ট্রি দেখুন) এবং একটি হ্যাশ বিকল্পগুলির থেকে একটি ফণা ভেঙে দেওয়া আসলেই খারাপ, কারণ রেডিসের অভ্যন্তরে প্রতিটি সাধারণ কী / মান জুটি প্রতি জোড়া +90 বাইট ব্যবহার করে।
এর অর্থ হ'ল আপনি যদি বিকল্প দুটি দিয়ে শুরু করেন এবং দুর্ঘটনাক্রমে সর্বাধিক হ্যাশ-জিপলিস্ট-মানটি ভেঙে যান তবে আপনি প্রতিটি মডেলটিতে 9090 বাইট পাবেন যা আপনার ব্যবহারকারীর মডেলের অভ্যন্তরে রয়েছে! (আসলে +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
....
}
দি হিপ্পো উত্তরের জন্য, অপশন একের মন্তব্যগুলি বিভ্রান্তিকর:
আপনার সমস্ত ক্ষেত্র বা একাধিক গেইট / সেট অপারেশন প্রয়োজন হলে উদ্ধার করতে hgetall / hmset / hmget
বিমিনিয়ার উত্তরের জন্য।
তৃতীয় বিকল্পটি আসলেই মজাদার, সর্বোচ্চ (আইডি) সহ ডেটাসেটের জন্য <হ'ল-ম্যাক্স-জিপলিস্ট-ভ্যালুতে এই সমাধানটিতে ও (এন) জটিলতা রয়েছে, কারণ আশ্চর্য, রেড্ডিস ছোট হ্যাশগুলিকে দৈর্ঘ্যের / কী / মানের অ্যারের মতো ধারক হিসাবে সংরক্ষণ করে store বস্তু!
তবে অনেক সময় হ্যাশগুলিতে কয়েকটি ক্ষেত্র থাকে। যখন হ্যাশগুলি ছোট হয় আমরা পরিবর্তে ওটিকে (এন) ডেটা স্ট্রাকচারে এনকোড করতে পারি, যেমন দৈর্ঘ্য-উপসর্গযুক্ত কী মান জোড়গুলির সাথে লিনিয়ার অ্যারের মতো। যেহেতু আমরা এটি কেবলমাত্র ছোট যখনই করি, তাই এইচজিইটি এবং এইচএসইটি কমান্ডের আনুপাতিক সময় এখনও ও (1) থাকে: হ্যাশটি এতে উপস্থিত উপাদানগুলির সংখ্যা বাড়ার সাথে সাথে একটি আসল হ্যাশ টেবিলে রূপান্তরিত হবে it
তবে আপনার চিন্তা করা উচিত নয়, আপনি হ্যাশ-সর্বাধিক জিপলিস্ট-এন্ট্রিগুলি খুব দ্রুত ভেঙে ফেলবেন এবং সেখানে গিয়ে আপনি এখন 1 নম্বর সমাধানে রয়েছেন।
দ্বিতীয় বিকল্পটি সম্ভবত হুডের নীচে চতুর্থ সমাধানে যাবে কারণ প্রশ্ন হিসাবে বলা হয়েছে:
মনে রাখবেন যে আমি যদি হ্যাশ ব্যবহার করি তবে মান দৈর্ঘ্য অনুমানযোগ্য নয়। তারা উপরের জৈব উদাহরণের মতো সমস্ত সংক্ষিপ্ত নয়।
এবং যেমনটি আপনি ইতিমধ্যে বলেছেন: চতুর্থ সমাধান হ'ল নিশ্চিতভাবে প্রতিটি বৈশিষ্ট্য অনুসারে +70 বাইট +
এই জাতীয় ডেটাসেট কীভাবে অনুকূল করা যায় সে সম্পর্কে আমার পরামর্শ:
আপনার কাছে দুটি বিকল্প রয়েছে:
আপনি যদি প্রথম সমাধানের চেয়ে কিছু ব্যবহারকারীর বৈশিষ্ট্যের সর্বাধিক আকারের গ্যারান্টি দিতে না পারেন এবং মেমরির বিষয়টি যদি রেডিসে স্টোর করার আগে ব্যবহারকারী জসনকে কমপ্রেস করার চেয়ে গুরুত্বপূর্ণ।
আপনি যদি সমস্ত বৈশিষ্ট্যের সর্বাধিক আকার জোর করতে পারেন। আপনি হ্যাশ-সর্বাধিক জিপলিস্ট-এন্ট্রি / মান সেট করতে পারবেন এবং ব্যবহারকারীর উপস্থাপনায় প্রতিটি হ্যাশ হিসাবে বা রেডিস গাইডের এই বিষয় থেকে হ্যাশ মেমরি অপ্টিমাইজেশন হিসাবে হ্যাশগুলি ব্যবহার করতে পারবেন: https://redis.io/topics/memory-optimization এবং স্টোর ব্যবহারকারী হিসাবে জসন স্ট্রিং। যে কোনও উপায়ে আপনি দীর্ঘ ব্যবহারকারীর বৈশিষ্ট্যগুলিও সংকুচিত করতে পারেন।