2012-02-20 3 views
7

Existe-t-il une implémentation de collection prenant en charge l'expiration des éléments.Implémentation Java Collection avec timeout des éléments

Par exemple:

Collection<User> cachedUsers = new ExpirableList<User>(10000); 

public ExpirableList(final long timeout){...} 

Et après le temps donné (10000ms dans cet exemple particulier), a ajouté des éléments seront supprimés de la collection. En l'utilisant, nous empêcherons le débordement de notre collection cachedUsers.

+0

On dirait que vous cherchez ... un cache: http://stackoverflow.com/questions/9352864 –

Répondre

9

Oui, goyave prend en charge un cache avec l'expiration chronométré. Voir Guava Explained's page on caches.

Une alternative est un cache LRU (utilisé récemment) qui dispose de l'élément accédé le plus ancien lorsqu'un nouvel élément est inséré.

2

Vous pouvez implémenter ceci en écrivant un wrapper pour, par exemple, un TreeMap où vous laissez l'heure d'insertion être la clé. Sur chaque insertion, vous pouvez supprimer la liste des têtes qui a "expiré". L'utilisation du temps d'insertion comme indication sur la nécessité ou non d'abandonner semble être une mauvaise idée. Il semble préférable d'utiliser un cache LRU (moins récemment utilisé) par exemple. Ces caches sont facilement disponibles dans les bibliothèques telles que EHCache par exemple. Ne pas réinventer la roue.

questions connexes:

+0

Insertions commis en même temps sont très rares, ain n'est-ce pas? –

+0

Haha. Bon point. La solution est évidemment de faire correspondre chaque horodatage à un ensemble d'objets :-) – aioobe

3

On ne sait pas vraiment comment vous essayez d'utiliser la collection, mais les CacheBuilder de Guava peuvent vous aider.

2

Une autre alternative est ExpiringMap:

Map<String, User> users = ExpiringMap.builder() 
    .expiration(10, TimeUnit.SECONDS) 
    .build(); 
Questions connexes