কী-মান স্টোরেজে আইটেমগুলির মেয়াদ শেষ হওয়ার জন্য অ্যালগরিদম কী?


10

আমি ভাবছিলাম যে কী কী-মূল্যের স্টোরগুলি আইটেমগুলির জন্য "মেয়াদ শেষ হওয়ার তারিখ" প্রয়োগ করে implement বর্তমানে আমার মনে এটির জন্য 2 টি রূপ রয়েছে:

  1. তারা কিছু করে না (মেয়াদোত্তীর্ণ ডেটা রাখে), এবং কেবলমাত্র যখন আপনি করেন তখন পরীক্ষা করেন, উদাহরণস্বরূপ, কিছু কী দিয়ে জোগান। এখানে সমস্যাটি হ'ল আপনি যদি স্মৃতিতে সীমাবদ্ধ থাকেন তবে মেয়াদোত্তীর্ণ আইটেমগুলি মোছা হবে না।
  2. তারা "মেয়াদ উত্তীর্ণের পূর্বের" পেতে সক্ষম হতে অতিরিক্ত ডেটা স্ট্রাকচার রাখে। আমি দেখছি এটি এরকম কিছু দিয়ে করা যায়:

    storage_data = dict(key -> [value, expire_timestamp])
    expire_tree = SomeBinaryLikeTree(expire_timestamp -> [keys])
    

উত্তর:


6

ক্যাশে মেয়াদোত্তীর্ণ এন্ট্রি মোছার সমস্যাটি আবর্জনা সংগ্রহের সমপরিমাণ , রেফারেন্স গণনার বিয়োগের জটিলতা।

নাসজা-ক্লাসার লোকেরা মেমক্যাসের জন্য ও (1) অ্যালগোরিদমকে নিম্নলিখিতভাবে প্রস্তাব করেছেন:

দেখে মনে হয় যে অনেক লোক কোনও কারণে বিশ্বাস করেছিলেন যে মেয়াদোত্তীর্ণ মেয়াদোত্তীর্ণ এন্ট্রিগুলি ও (1) এ সঞ্চালিত হতে পারে না, এমনকি এটির জন্য ওমেগা (এন) অপারেশনও প্রয়োজন। একটি গাদা, বা অন্যান্য অগ্রাধিকারের সারি ডেটা স্ট্রাকচার ব্যবহার করা আপনাকে অবশ্যই O (লগ এন) দিতে পারে তবে নীচের প্যাচটি ও (1) এ লক্ষ্য করে। প্রতিটি সেকেন্ডের জন্য একটি বালতি রেখে এবং মেয়াদোত্তীর্ণ সময়টি দেখে প্রতিটি বালিকে যথাযথ বালতিতে রেখে এটি অর্জন করা হয়। তারপরে প্রতিটি সেকেন্ডে আমরা কেবল পরবর্তী বালতি থেকে উপাদানগুলি মুক্ত করি। এটি অবশ্যই হে (1) মোড়িত সময়, তবে এটি ঘটতে পারে যে আপনার অনেকগুলি উপাদান রয়েছে যা একই মুহুর্তে শেষ হয়, তাই প্যাচটি ক্রম সংখ্যার জন্য একটি নির্দিষ্ট সীমা সরবরাহ করে যা আপনি প্রতি অনুরোধ সম্পাদন করতে ইচ্ছুক, আবর্জনা সংগ্রহ মসৃণ চালানোর জন্য।

সংযুক্ত কোড সহ পুরো প্রস্তাব দেখুন ।


ধন্যবাদ। আমি "বালতি" সমাধানটিও এক উপায় হিসাবে ভেবেছিলাম। "বালতিতে অত্যধিক আইটেম" নিয়ে কোনও সমস্যা নেই যেহেতু আপনি অ্যালগরিদমের সাথে যেতে পারেন "আপনি শেষবারের মতো বালতি নেন নি এবং শেষ হয়ে গেলে ফিরে আসুন"।
Kostiantyn Rybnikov

@ কে_বিএক্স: এজন্য তারা ডাবল লিঙ্কযুক্ত তালিকার প্রস্তাব দেয়, যাতে আপনি আগের বালতিগুলিতে ফিরে যেতে পারেন।
ভের্টেক

যদি বালতিগুলি সেকেন্ডের মতো কিছু হয় তবে আপনার লিঙ্কযুক্ত তালিকার কোনও প্রয়োজন নেই। আগের দিকে যেতে, আপনি কী কী হ্রাস করেছেন :)
কোস্টিয়্যান্টিন রাইবনিকভ

@ কে_বিএক্স: কী পরিমাণ কমেছে? এক সেকেন্ড? 5 মিনিট আগে যদি সম্পূর্ণরূপে খালি বালতিটি না হয় তবে কী হবে? 1s 300 বার ধাপে হ্রাস?
ভের্টেক

প্রথম সার্ভার শুরুর সময়, আপনি কারেন্ট_একটিপায়ার_বকেট নামে কিছু পরিবর্তন করতে পারবেন init তারপরে, আপনি কারেন্ট_একপায়ার_বকেট থেকে শুরু করে বর্তমান দ্বিতীয়টি শেষ করে ক্লিনআপ চালান। পরিচ্ছন্নতা শেষ হওয়ার পরে, আপনি কিছু ক্ষুদ্র সময়ের জন্য ঘুমান। যদি সার্ভারটি বন্ধ হয়ে যায়, আপনি আবার একই "এক্সপায়ার বালতি" দিয়ে যাবেন, হ্যাঁ, তবে এটি কেবল সার্ভার স্টপগুলিতেই হওয়া উচিত।
Kostiantyn Rybnikov

7

আমি ধরে নিয়েছি কী-মানক স্টোরেজটি কেবলমাত্র কেভিওর মেয়াদ শেষ হতে পারে তা জানতে সমস্ত কেভি-জোড়ায় পুনরাবৃত্তি করতে খুব বড়। আমি এটিও ধরে নিয়েছি যে প্রতিটি পঠন অ্যাক্সেস মেয়াদোত্তীর্ণ টাইমস্ট্যাম্পকে রিফ্রেশ করে, তাই কেবলমাত্র কিছু আইটেম যা কিছু সময়ের জন্য অ্যাক্সেস করা হয়নি তা মেয়াদ শেষ হয়ে গেছে।

চ্যালেঞ্জটি হ'ল সমস্ত রেকর্ডগুলি দক্ষতার সাথে সন্ধান করা যা শেষ হতে পারে (যখনই ক্লিনআপের সময়সীমা রয়েছে), তবে প্রতিটি পঠনের অ্যাক্সেসের উপর দক্ষতার সাথে মেয়াদোত্তীর্ণ টাইমস্ট্যাম্পটি রিফ্রেশ করুন (সুতরাং আমাদের অবশ্যই সমাপ্তির জন্য ব্যবহৃত কাঠামোর কীটি সন্ধান করতে হবে)।

আমার প্রস্তাব: বালিকাতে গ্রুপের মেয়াদোত্তীর্ণতার সময়সীমা; উদাহরণস্বরূপ, আইটেমগুলি যদি 8 ঘন্টা বেঁচে থাকে তবে প্রতি ঘন্টা একটি বালতি তৈরি করুন। এই বালতিগুলি একটি লিঙ্কযুক্ত তালিকায় রাখা হয়েছে; মেয়াদোত্তীর্ণ হওয়ার পরে, প্রথম বালতিটি খালি করে তালিকাটি হ্রাস করা হয়। বালতির সংখ্যাটি আজীবন / ক্লিনআপের বিরতি। প্রতিটি বালতিতে সমস্ত কীগুলির একটি হ্যাশসেট রয়েছে যা শেষ হতে হবে। একটি হ্যাশসেটের সমস্ত কীগুলির মধ্যে আইট্রেটেশন যথেষ্ট দক্ষ।

পাঠ্য অ্যাক্সেসের সময়, প্রোগ্রামটি পরীক্ষা করে যে কীটি বর্তমানে কী বালতিতে রয়েছে এবং কোন বালতিটি এখন তা অন্তর্ভুক্ত। বেশিরভাগ ক্ষেত্রে, এটি একই বালতি, সুতরাং আর কোনও পদক্ষেপের প্রয়োজন নেই। অন্যথায়, পুরানো বালতি থেকে কীটি সরিয়ে ফেলুন (একটি হ্যাশ সেট থেকে অপসারণ দক্ষ) এবং এটি নতুন বালতিতে intoোকান।

   +--------------+   +--------------+   +--------------+
-->+ Expiry 08:00 +-->+ Expiry 09:00 +-->+ Expiry 10:00 +
   | KeySet       |   | KeySet       |   | KeySet       |
   +--------------+   +--------------+   +--------------+
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.