Caché en Java con Caffeine

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

¿Qué es Caffeine?

Caffeine es una biblioteca de alto rendimiento para almacenamiento en caché en el lenguaje Java, diseñada teniendo en cuenta los requisitos modernos de velocidad y eficiencia. Proporciona una caché en memoria con soporte para operaciones asíncronas, expulsión automática de entradas por tiempo o tamaño, así como políticas de desalojo configurables (por ejemplo, basadas en la frecuencia de uso). La biblioteca es totalmente compatible con Java 8 y versiones posteriores, y se utiliza activamente en proyectos grandes, como Spring Framework (a través de Spring Cache).

¿Para qué sirve?

El almacenamiento en caché permite reducir el tiempo de acceso a los datos, disminuir la carga en las bases de datos o API externas, y mejorar la capacidad de respuesta de la aplicación. Caffeine resuelve estas tareas con una sobrecarga mínima: proporciona latencias de submicrosegundos para lectura y escritura, gestiona automáticamente la memoria y permite configurar la caché de forma flexible según los requisitos comerciales específicos. Sin él, tendrías que implementar la caché manualmente usando HashMap y temporizadores, lo cual es complejo y poco fiable.

Instalación

Añade la dependencia a tu archivo pom.xml (Maven):

<dependency>    <groupId>com.github.ben-manes.caffeine</groupId>    <artifactId>caffeine</artifactId>    <version>3.1.8</version></dependency>

Para Gradle:

implementation 'com.github.ben-manes.caffeine:caffeine:3.1.8'

Funciones principales

  • Expulsión automática: eliminación de entradas por tiempo de vida (expireAfterWrite, expireAfterAccess) o por tamaño (maximumSize, maximumWeight).
  • Carga asíncrona: a través de AsyncCache o métodos loadingCache con soporte para CompletableFuture.
  • Estadísticas: recopilación de métricas (hit rate, miss rate, evictions) para monitorización.
  • Políticas de desalojo: por defecto se utiliza Window TinyLFU (un algoritmo adaptativo cercano al óptimo).
  • Seguridad contra null: manejo correcto de valores null.

Ejemplo de código en Java

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(100) .recordStats() .build();

// Escritura en la caché cache.put("user:123", "Alice");

// Lectura con carga automática String user = cache.get("user:456", key -> fetchFromDatabase(key)); System.out.println(user); // null o resultado de fetch

// Estadísticas System.out.println(cache.stats().hitRate()); }

private static String fetchFromDatabase(String key) { return "Bob"; // Simulación de consulta a la BD }}

Cuándo usarlo

Caffeine es ideal para almacenar en caché los resultados de llamadas a API, datos de bases de datos, cálculos o cualquier operación que se ejecute con frecuencia y tenga un alto costo. Úsalo en aplicaciones web, microservicios, procesos ETL o en cualquier proyecto Java que requiera una caché rápida y fiable. Evita Caffeine si necesitas almacenamiento en caché distribuido (en ese caso, considera Redis o Hazelcast).

Recommendations