2011-10-13 13 views
7

मुझे Map (या कोई भी संग्रह) की आवश्यकता है जो प्रविष्टियों के लिए समय-सारिणी का समर्थन करता है और उन्हें स्वचालित रूप से हटा देता है।स्वचालित रूप से समाप्त होने वाले तत्वों के साथ मानचित्र

मुझे पता है कि अमरूद MapMaker है, लेकिन यह अपने तत्वों को स्वचालित रूप से चलने वाले थ्रेड द्वारा क्रमशः पढ़ने/लिखने के संचालन पर समाप्त करता है। इसके अलावा MapMaker की समाप्ति क्षमताओं को अब CacheBuilder पर ले जाया गया है। बात यह है कि, मुझे कैश नहीं चाहिए - मैं तत्वों की समाप्ति करना चाहता हूं

क्या कुछ उपयोग करने के लिए तैयार है? बल्कि नहीं http://code.google.com/p/concurrentlinkedhashmap/wiki/ExpirableCache
... यह अनसुलझे आयात के बहुत सारे हैं: (यह मुश्किल इसे अपने आप को लागू करने के लिए नहीं है, लेकिन यह कुछ पुन: उपयोग करना बेहतर है)

+0

आप किसी भी तरह स्पष्ट रूप से करने के लिए तत्वों की जरूरत है "मर" समय पर (जैसे कुछ विधि को फोन करके)? यदि आपको केवल समय समाप्त होने वाले तत्वों को फेंकने की आवश्यकता है, तो एक्सेस समय पर तत्वों के टाइमस्टैम्प की जांच करना पर्याप्त होना चाहिए। – 9000

+1

आप समय-समय पर चलने वाली प्रविष्टियों के निष्कासन को ट्रिगर करने के लिए चल रहे थ्रेड को Cache.cleanup() पर कॉल कर सकते हैं। तत्काल नहीं, एक चलने वाले थ्रेड में आंतरिक रूप से बहुत सी सीमाएं थीं (जे 2 ईई/जीएई संगत नहीं, कुत्ते के प्रभाव से पीड़ित है, आदि)। –

+0

@ बेन मैनस सुझाव के लिए धन्यवाद। हालांकि मुझे कैश इंटरफ़ेस पसंद नहीं है। सबसे पहले, यह आपको मूल्य गणना निर्दिष्ट करने के लिए मजबूर करता है। मुझे इसकी आवश्यकता नहीं है। अगर मैं शून्य लौटाता हूं, तो यह एनपीई फेंकता है। ऐसा इसलिए है क्योंकि यह हमेशा getOrCompute को कॉल करता है, और मुझे बस एक साधारण मानचित्र की तरह मिलना चाहिए। फिर, एनपीई को पकड़ने के साथ भी, मैं इसे काम नहीं कर सका (शायद मेरी गलती), लेकिन यह हमेशा प्रविष्टियों की समाप्ति कर रहा था, भले ही उन्हें एक्सेस किया गया हो। – Bozho

उत्तर

2

शायद।

+0

अच्छा समाप्त हो जाएगा, मैं इसे कल – Bozho

+0

जांच करेंगे इसका एक (पुराने) प्रदर्शन-परक ट्यूटोरियल के बजाय एक प्रदान की पुस्तकालय, इसलिए अनसुलझे आयात उचित लग रहा था। यह एक बेवकूफ और आम दृष्टिकोण है। मैं अमूर्त दृष्टिकोण को पसंद करता हूं जिसे हमने अमरूद में जोड़ा है क्योंकि इससे पुरानी घटनाओं को दूर किया जाता है। –

2

यदि कुछ और नहीं है, तो आप एक डमी CacheLoader आपूर्ति कर सकते हैं जो केवल अपवाद फेंकता है, फिर Cache.get पर कॉल न करें - केवल asMap व्यू के साथ इंटरैक्ट करें। यह सुंदर नहीं है, लेकिन हम 11.0 में इस मामले का बेहतर समर्थन करने के लिए काम कर रहे हैं। सुनिश्चित करें कि यदि आप इसे आजमाते हैं तो आपके पास Guava 10.0.1 है।

और हाँ, Cache.cleanUp आपके लिए जितनी बार चाहें उतनी बार कॉल करने के लिए वहां है।

+0

ने कोशिश की, लेकिन 'asMap' दृश्य इंटरैक्शन अंतिम पहुंच को रीफ्रेश नहीं करता है। – Bozho

0

अपाचे मीना का एक्सपीरिंग मैप बिल्कुल वही है जो आप खोज रहे हैं।

http://mina.apache.org/mina-project/apidocs/org/apache/mina/util/ExpiringMap.html

+2

लिंक-केवल उत्तर ही सर्वोत्तम प्रकार के उत्तर नहीं हैं।क्या आप इसे छोटा कोड नमूना प्रदान करके विस्तार कर सकते हैं? –

+0

देखें [ExpiringMap] (https://github.com/jhalterman/expiringmap)। यह सृजन या एक्सेस समय के आधार पर प्रविष्टियों की अवधि समाप्त कर सकता है। – Jonathan

0

मैं Map कि Hazelcast प्रदान करता है का उपयोग करने के सिफारिश करेंगे। यह वितरित capabilites भी प्रदान करता है लेकिन शायद आप उनमें रुचि नहीं रखते हैं। आपको केवल समाप्त होने वाली पॉलिसी (time-to-live-seconds और max-idle-seconds) को कॉन्फ़िगर करने की आवश्यकता है और Map का उपयोग करें जैसे जावा का HashMap होगा।

अधिक जानकारी यहां पाया जा सकता: Hazelcast Distributed Map

संबंधित मुद्दे