Je recherche un cache Java en mémoire simple qui a une bonne concurrence (donc LinkedHashMap n'est pas assez bon), et qui peut être sérialisé sur le disque périodiquement.
Une fonctionnalité dont j'ai besoin, mais qui s'est avérée difficile à trouver, est un moyen de «jeter un coup d'œil» sur un objet. J'entends par là récupérer un objet du cache sans que le cache ne retienne l'objet plus longtemps qu'il ne l'aurait autrement.
Mise à jour: Une exigence supplémentaire que j'ai négligée de mentionner est que je dois être en mesure de modifier les objets mis en cache (ils contiennent des tableaux flottants) sur place.
Quelqu'un peut-il fournir des recommandations?
Réponses:
Depuis que cette question a été posée à l'origine, la bibliothèque Guava de Google comprend désormais un cache puissant et flexible. Je recommanderais d'utiliser ceci.
la source
Ehcache est une très bonne solution pour cela et a un moyen de voir ( getQuiet () est la méthode) de sorte qu'il ne met pas à jour l'horodatage d'inactivité. En interne, Ehcache est implémenté avec un ensemble de cartes, un peu comme ConcurrentHashMap, il présente donc des avantages similaires en matière de concurrence.
la source
Si vous avez besoin de quelque chose de simple, cela conviendrait-il?
Il ne sera pas enregistré sur le disque, mais vous avez dit que vous vouliez simple ...
Liens:
(Comme Adam l'a commenté, la synchronisation d'une carte a un impact sur les performances. Ne pas dire que l'idée n'a pas de poils dessus, mais qu'elle suffirait comme solution rapide et sale.)
la source
ConcurrentHashMap<WeakReference<T>>
. docs.oracle.com/javase/7/docs/api/java/lang/ref/…Une autre option pour un cache java en mémoire est cache2k . Les performances en mémoire sont supérieures à EHCache et google guava, voir la page des tests de cache2k .
Le modèle d'utilisation est similaire à celui des autres caches. Voici un exemple:
Si vous avez google goyave comme dépendance, essayer le cache de goyave peut être une bonne alternative.
la source
Vous pouvez facilement utiliser imcache . Un exemple de code est ci-dessous.
la source
Essaye ça:
la source
public static SimpleCacheManager getInstance() {
devrait êtrepublic synchronized static SimpleCacheManager getInstance() {
sinonif (instance == null) {
n'est pas thread-safe. Dans ce cas, vous pouvez supprimer l'objet moniteur tous ensemble puisque la synchronisation a lieu pour tous les appels getInstance (), voir: javaworld.com/article/2073352/core-java/…Essayez
@Cacheable
de jcabi-aspects . Avec une seule annotation, vous pouvez mettre en cache l'ensemble du résultat de la méthode en mémoire:Lisez également cet article: http://www.yegor256.com/2014/08/03/cacheable-java-annotation.html
la source
Que diriez-vous de ceci: https://commons.apache.org/proper/commons-jcs/ (mis à jour à la nouvelle adresse, car JCS est maintenant dans Apache Commons)
la source
Essayez Ehcache ? Il vous permet de brancher vos propres algorithmes d'expiration de mise en cache afin que vous puissiez contrôler vos fonctionnalités d'aperçu.
Vous pouvez sérialiser sur disque, base de données, sur un cluster, etc.
la source