2010-12-28 11 views
5

Próbuję utworzyć mapę, w której wpisy przekroczą limit czasu i zostaną usunięte po określonym czasie.Mapa z wpisami czasowymi/przejściowymi - pamięć nie jest problemem

Zasadniczo, <K, V> Map.put(K key, V value, long **time**) - wpis zostanie natychmiast umieszczony na mapie i wygaśnie po czasie (ms). Nie muszę odzyskiwać usuniętego wpisu w żadnym momencie w przyszłości, ale chcę się upewnić, że nie ma go już na mapie.

Na przykład: map.put("foo", "bar", 60l * 1000l) spowoduje, że ta para klucz-wartość będzie żyła na mapie przez minutę (60long i 1000long).

Próba: użyć ConcurentMap i wdrożenie Map.put(K key, V value, long **time**) poprzez następujące:
1. połączenia super.put(key, value)
2. utworzyć gwint, który może pomieścić na raz(MS)
3. połączenia remove(key) celu usunięcia wpisu.

Pytanie: proszę o komentarz/daj mi znać, czy jest to dobry pomysł pod względem bezpieczeństwa wątku, spójności lub wszelkich błędów w mojej próbie. Jeśli uważasz, że jest lepszy sposób, aby to osiągnąć, podaj wszelkie porady.

Edycja: Dzięki za odpowiedzi, pamięć nie jest tutaj problemem, naprawdę zależy mi tylko na krótkim okresie życia wpisów. Dziękuję Ci.

Odpowiedz

4

Czy czas jest istotną częścią problemu, który rozwiązujesz? Czy to jest szczegół wdrożenia? Jeśli problem, który rozwiązujesz, jest jednym z zastosowań pamięci, to przychodzą na myśl dwie inne możliwości:

  • Mapa LRU. Jest ich wiele w Internecie.
  • Mapa wspierana przez obiekty WeakReference lub SoftReference, które umożliwiają GC gromadzenie tych elementów.

EDIT

W tym przypadku istnieją pewne istniejące implementacje, które mogą zaoszczędzić trochę czasu. Na przykład:

+0

Dzięki za odpowiedź, ale jestem zaniepokojony tylko z czasu tutaj, pamięć nie jest problemem. –

+0

+1 do szybkiej edycji.Chcę, aby wpisy były żywe przez różną ilość czasu, ale druga implementacja z Timerem jest bardzo pomocna. Dzięki. –

1

Jeśli robisz to z powodu jakiegoś problemu pamięci (mapa jest doczesne cache), należy prawdopodobnie rozważ użycie miękkich odniesień (documentation).

+1

Nie mogłem znaleźć, jak miękkie referencje pozwalają mi na odmierzanie obiektów, czy możesz być trochę bardziej konkretny? Dzięki. –

+1

Nie ma prawdziwego połączenia. Po prostu mówi, że często istnieje połączenie między mapą używaną jako pamięć podręczna a miękkimi odniesieniami. Bit tymczasowy można zignorować. Guava's MapMaker ma opcje tworzenia miękkich odniesień, FYI. –

1

Spójrz na Guava - jest to biblioteka kolekcji od Google. W szczególności chcesz spojrzeć na CacheBuilder i jego mapy komputerowe. Jedną z jego funkcji jest "czasowe wygaśnięcie wpisów mierzone od ostatniego dostępu lub ostatniego zapisu", brzmi dokładnie tak, jak tego szukasz.

(Zmieniano mówić o CacheBuilder; to nowy odkąd opublikowany i jest to bardziej istotne pytanie)

+0

Dzięki za referencję dla Guawy. –