L'un d'entre vous connaît-il une carte Java ou un magasin de données standard similaire qui purge automatiquement les entrées après un délai donné? Cela signifie le vieillissement, où les anciennes entrées expirées «vieillissent» automatiquement.
De préférence dans une bibliothèque open source accessible via Maven?
Je connais des moyens d'implémenter la fonctionnalité moi-même et je l'ai fait plusieurs fois dans le passé, donc je ne demande pas de conseils à cet égard, mais des pointeurs vers une bonne implémentation de référence.
Les solutions basées sur WeakReference comme WeakHashMap ne sont pas une option, car mes clés sont probablement des chaînes non internes et je veux un délai configurable qui ne dépend pas du garbage collector.
Ehcache est également une option sur laquelle je ne voudrais pas compter car il a besoin de fichiers de configuration externes. Je recherche une solution uniquement codée.
la source
Réponses:
Oui. Google Collections, ou Guava comme il est nommé, a maintenant quelque chose appelé MapMaker qui peut faire exactement cela.
Mettre à jour:
À partir de la goyave 10.0 (publiée le 28 septembre 2011), beaucoup de ces méthodes MapMaker sont obsolètes au profit du nouveau CacheBuilder :
la source
weakKeys()
implique que les clés sont comparées à l'aide de la sémantique ==, nonequals()
. J'ai perdu 30 minutes pour comprendre pourquoi mon cache à chaînes ne fonctionnait pas :)weakKeys()
est important.weakKeys()
n'est pas requis 90% du temps.Il s'agit d'un exemple d'implémentation que j'ai fait pour la même exigence et la concurrence fonctionne bien. Pourrait être utile à quelqu'un.
Git Repo Link (avec implémentation du récepteur)
https://github.com/vivekjustthink/WeakConcurrentHashMap
À votre santé!!
la source
cleanMap()
moitié du temps spécifié?Vous pouvez essayer mon implémentation d'une carte de hachage à expiration automatique. Cette implémentation n'utilise pas de threads pour supprimer les entrées expirées, mais utilise à la place DelayQueue qui est nettoyée à chaque opération.
la source
Apache Commons a un décorateur pour que les entrées de la carte expirent: PassiveExpiringMap C'est plus simple que les caches de Guava.
PS attention, ce n'est pas synchronisé.
la source
Cela ressemble à ehcache est exagéré pour ce que vous voulez, mais notez qu'il n'a pas besoin de fichiers de configuration externes.
C'est généralement une bonne idée de déplacer la configuration dans des fichiers de configuration déclaratifs (vous n'avez donc pas besoin de recompiler lorsqu'une nouvelle installation nécessite un délai d'expiration différent), mais ce n'est pas du tout requis, vous pouvez toujours le configurer par programme. http://www.ehcache.org/documentation/user-guide/configuration
la source
Les collections Google (goyave) ont le MapMaker dans lequel vous pouvez définir un délai (pour l'expiration) et vous pouvez utiliser une référence douce ou faible lorsque vous choisissez en utilisant une méthode d'usine pour créer des instances de votre choix.
la source
vous pouvez essayer la carte expirante http://www.java2s.com/Code/Java/Collections-Data-Structure/ExpiringMap.htm une classe du projet Apache MINA
la source
Si quelqu'un a besoin d'une chose simple, voici un simple jeu d'expiration de clé. Il peut être facilement converti en carte.
la source
System.nanoTime()
pour calculer les différences de temps car System.currentTimeMillis () n'est pas cohérent car il dépend de l'heure du système et peut ne pas être continu.En règle générale, un cache doit conserver les objets quelque temps et doit en exposer un peu plus tard. Le moment idéal pour tenir un objet dépend du cas d'utilisation. Je voulais que cette chose soit simple, sans fils ni ordonnanceurs. Cette approche fonctionne pour moi. Contrairement à
SoftReference
s, les objets sont garantis disponibles pendant un minimum de temps. Cependant, ils ne restent pas en mémoire jusqu'à ce que le soleil se transforme en une géante rouge .Comme exemple d'utilisation, pensez à un système qui répond lentement et qui pourra vérifier si une demande a été effectuée assez récemment, et dans ce cas ne pas effectuer l'action demandée deux fois, même si un utilisateur agité appuie plusieurs fois sur le bouton. Mais, si la même action est demandée quelque temps plus tard, elle doit être exécutée à nouveau.
la source
Le cache de goyave est facile à mettre en œuvre. Nous pouvons expirer la clé sur une base de temps en utilisant le cache de goyave. J'ai lu entièrement le post et ci-dessous donne la clé de mon étude.
Référence: exemple de cache de goyave
la source