174 votes

Comment mettrait en œuvre un cache LRU dans Java 6 ?

Merci de ne pas dire EHCache ou OSCache, etc. Supposons, pour les fins de cette question que je veux implémenter mon propre juste en utilisant le kit de développement (learning by doing). Étant donné que le cache doit être utilisé dans un environnement multithread, structures de données utilisez-vous? J'ai déjà mis en place une aide LinkedHashMap et Collections#synchronizedMap, mais je suis curieux de savoir si l'une des nouvelles concurrentes des collections seraient de meilleurs candidats.

Mise à JOUR: je viens de lire à travers Yegge dernier , lorsque j'ai découvert cette pépite:

Si vous avez besoin de constante de temps d'accès et que vous souhaitez maintenir l'ordre d'insertion, vous ne pouvez pas faire mieux qu'une LinkedHashMap, une très bonne structure de données. La seule façon dont il pourrait être plus merveilleux est que si il y avait une version simultanée. Mais hélas.

Je pensais presque exactement la même chose avant, je suis allé avec l' LinkedHashMap + Collections#synchronizedMap mise en œuvre je l'ai mentionné ci-dessus. Agréable de savoir que je n'avais pas juste oublié quelque chose.

Sur la base des réponses jusqu'à présent, il semble que mon meilleur pari pour une très simultanées LRU serait d'étendre ConcurrentHashMap à l'aide de certains de la même logique que l' LinkedHashMap utilise.

105voto

Hank Gay Points 36173

J’aime beaucoup de ces suggestions, mais pour l’instant, je pense que je vais rester avec + . Si j’ai revoir cela à l’avenir, je vais probablement travailler sur l’extension de la même manière s’étend `` .

MISE À JOUR :

Demande, voici l’essentiel de mon implémentation actuelle.

19voto

Joe Points 181

19voto

Hank Gay Points 36173

Si je faisais cela à nouveau à partir de zéro aujourd'hui, je voudrais utiliser de goyave `` .

8voto

Ron Points 1149

Il existe deux implémentations open source.

Apache Solr a ConcurrentLRUCache: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/src/common/org/apache/solr/common/util/ConcurrentLRUCache.java?view=log

Il y a un projet open source pour un ConcurrentLinkedHashMap: http://code.google.com/p/concurrentlinkedhashmap/

7voto

Steve McLeod Points 19016

Je considère à l’aide de java.util.concurrent.PriorityBlockingQueue, avec priorité déterminée par un compteur « numberOfUses » dans chaque élément. Je serais très, très prudent pour obtenir tous mes synchronisation corriger, comme le compteur de « numberOfUses » indique que l’élément ne peut être immuable.

L’objet de l’élément est un wrapper pour les objets dans le cache :

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X