Maison >Java >javaDidacticiel >Comment implémenter un cache LRU en Java : LinkedHashMap vs ConcurrentHashMap ?

Comment implémenter un cache LRU en Java : LinkedHashMap vs ConcurrentHashMap ?

Patricia Arquette
Patricia Arquetteoriginal
2024-10-28 03:13:02336parcourir

How to Implement an LRU Cache in Java: LinkedHashMap vs. ConcurrentHashMap?

Développement d'un cache LRU en Java

Dans ce contexte, un cache LRU (Least Récemment utilisé) fait l'hypothèse que le cache le moins récemment utilisé les entrées ont moins de valeur et peuvent être supprimées si nécessaire pour maintenir la capacité du cache. Pour y parvenir en Java, considérons les approches suivantes :

1. LinkedHashMap avec synchronisation

Vous avez mentionné l'utilisation de LinkedHashMap avec Collections#synchronizedMap. Il s'agit d'une approche valable, utilisant la structure de liste à double lien intégrée de LinkedHashMap pour maintenir le comportement LRU, avec une synchronisation protégeant le cache dans un environnement multithread.

2. Collections simultanées

Bien que les nouvelles collections simultanées offrent des performances améliorées, elles ne disposent pas de la fonctionnalité LRU intégrée. Par conséquent, étendre ConcurrentHashMap, en incorporant la logique de LinkedHashMap, pourrait fournir une implémentation LRU hautement concurrente.

Implémentation actuelle

Après avoir examiné les suggestions, vous avez opté pour l'approche LinkedHashMap Collections.synchronizedMap pour l'instant. En réexaminant cela à l'avenir, étendre ConcurrentHashMap pourrait être une option viable.

Voici un extrait de votre implémentation actuelle pour référence :

<code class="java">private class LruCache<A, B> extends LinkedHashMap<A, B> {
    private final int maxEntries;

    public LruCache(final int maxEntries) {
        super(maxEntries + 1, 1.0f, true);
        this.maxEntries = maxEntries;
    }

    // Check if the cache exceeds its maximum size
    @Override
    protected boolean removeEldestEntry(final Map.Entry<A, B> eldest) {
        return super.size() > maxEntries;
    }
}

Map<String, String> example = Collections.synchronizedMap(new LruCache<String, String>(CACHE_SIZE));</code>

Ce cache utilise la méthode removeEldestEntry pour supprimer le moins entrée récemment utilisée lorsque le cache atteint sa taille maximale, en conservant le comportement LRU.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn