Mise en cache en Java : Redis, Memcached et solutions intégrées

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Introduction : Pourquoi mettre en cache en Java ?



Les applications Java modernes travaillent souvent avec de grands volumes de données. Chaque requête à une base de données ou à une API externe représente un coût en temps et en ressources. Sans mise en cache, lorsque la charge augmente, les performances chutent et le temps de réponse augmente. La mise en cache permet de stocker les données fréquemment demandées dans un accès rapide (en mémoire vive), ce qui réduit les latences et diminue la charge sur le backend.



En Java, il existe trois approches principales pour la mise en cache : les solutions intégrées (par exemple, HashMap ou Caffeine), les systèmes distribués (Redis et Memcached). Dans cet article, nous analyserons chacune d'elles, fournirons des exemples de code et vous aiderons à choisir l'option optimale pour votre projet.



1. Mise en cache intégrée en Java



La mise en cache intégrée est le moyen le plus simple d'accélérer une application. Les données sont stockées directement dans la mémoire de la JVM. Principaux avantages : latence d'accès minimale, simplicité de configuration. Inconvénients : volume limité (dépend du heap), les données sont perdues lors du redémarrage de l'application.



1.1. Mise en cache simple avec HashMap



L'option la plus basique consiste à utiliser ConcurrentHashMap avec une gestion manuelle de la durée de vie. Convient pour les prototypes, mais pas pour la production (pas de nettoyage automatique, risques de fuites mémoire).



import java.util.concurrent.ConcurrentHashMap;import java.util.concurrent.TimeUnit;

public class SimpleCache { private final ConcurrentHashMap<String, CacheEntry> cache = new ConcurrentHashMap<>();

public void put(String key, Object value, long ttlMillis) { cache.put(key, new CacheEntry(value, System.currentTimeMillis() + ttlMillis)); }

public Object get(String key) { CacheEntry entry = cache.get(key); if (entry == null || System.currentTimeMillis() > entry.expiry) { cache.remove(key); return null; } return entry.value; }

private static class CacheEntry { private final Object value; private final long expiry; // constructeur et getters }}


1.2. Caffeine — une bibliothèque de mise en cache moderne



Caffeine est une bibliothèque Java haute performance utilisée par défaut dans Spring Cache. Elle prend en charge l'éviction automatique basée sur le temps, la taille, ainsi que les éléments pondérés. Caffeine est plus rapide que Guava Cache (sur laquelle elle est basée).



import com.github.benmanes.caffeine.cache.Cache;import com.github.benmanes.caffeine.cache.Caffeine;import java.util.concurrent.TimeUnit;

public class CaffeineExample { public static void main(String[] args) { Cache<String, String> cache = Caffeine.newBuilder() .expireAfterWrite(10, TimeUnit.MINUTES) .maximumSize(1000) .build();

cache.put("user:123", "John Doe"); String user = cache.getIfPresent("user:123"); System.out.println("Cached user: " + user); }}


Pour la production, il est recommandé d'utiliser Caffeine ou Ehcache (qui prend en charge le stockage sur disque). Les solutions intégrées sont idéales pour les microservices et les monolithes à instance unique.



2. Memcached : mise en cache distribuée pour Java



Memcached est un système de mise en cache distribué fonctionnant en mémoire vive. Il est simple, rapide et prend en charge la mise à l'échelle horizontale. Principales caractéristiques :

  • Stockage sous forme de paires "clé-valeur" (taille maximale de la valeur — 1 Mo).
  • Ne prend pas en charge la persistance (les données disparaissent lors du redémarrage).
  • Pas d'authentification ni de chiffrement intégrés.

Pour travailler avec Memcached en Java, on utilise le plus souvent la bibliothèque SpyMemcached ou

Blogs

Book Recommendations