मुझे लगता है कि की-वैल्यू स्टोरेज बहुत बड़ी है, जो सभी केवी-जोड़े पर यह पता लगाने के लिए है कि इसकी समय सीमा समाप्त हो सकती है। मैं यह भी मानता हूं कि प्रत्येक रीड एक्सेस एक्सपायरी टाइमस्टैम्प को रीफ्रेश करता है, इसलिए केवल कुछ समय के लिए एक्सेस नहीं किए गए आइटम समाप्त हो जाते हैं।
चुनौती कुशलता से उन सभी रिकॉर्डों को ढूंढना है जो समाप्त हो सकते हैं (जब भी सफाई होती है), लेकिन यह भी कुशलतापूर्वक हर रीड एक्सेस पर एक्सपायरी टाइमस्टैम्प को ताज़ा करता है (इसलिए हमें समाप्ति के लिए उपयोग की जाने वाली संरचना में कुंजी ढूंढनी चाहिए)।
मेरा प्रस्ताव: बाल्टी में समूह expiry_timestamps; उदाहरण के लिए, यदि आइटम 8 घंटे रहते हैं, तो प्रति घंटे एक बाल्टी बनाएं। उन बाल्टी को एक लिंक्ड सूची में रखा गया है; जब समाप्ति होती है, तो पहली बाल्टी खाली हो जाती है और सूची कम हो जाती है। बाल्टियों की संख्या जीवनकाल / सफाई अंतराल है। प्रत्येक बकेट में सभी कुंजियों का एक हैशसेट होता है जिसे समाप्त किया जाना चाहिए। एक हैशसेट में सभी कुंजियों पर परिवर्तन पर्याप्त कुशल है।
रीड एक्सेस के दौरान, प्रोग्राम यह जांचता है कि वर्तमान में किस बाल्टी की कुंजी है और यह किस बाल्टी की है। ज्यादातर मामलों में, यह एक ही बाल्टी है, इसलिए आगे कोई कार्रवाई आवश्यक नहीं है। अन्यथा, पुरानी बाल्टी से कुंजी निकालें (हैश सेट से निकालना कुशल है) और इसे नई बाल्टी में डालें।
+--------------+ +--------------+ +--------------+
-->+ Expiry 08:00 +-->+ Expiry 09:00 +-->+ Expiry 10:00 +
| KeySet | | KeySet | | KeySet |
+--------------+ +--------------+ +--------------+