Caching en Java: Redis y otras soluciones
\n\nEl caching es una de las técnicas clave para optimizar el rendimiento de las aplicaciones Java. Permite reducir el tiempo de respuesta, disminuir la carga en las bases de datos y reducir los costos de infraestructura. En este artículo, analizaremos en detalle las bibliotecas y herramientas populares para caching en Java: Redis, Ehcache, Caffeine y Hazelcast. Aprenderá cuándo y qué herramienta elegir, y también verá ejemplos de código funcionales.
\n\n¿Por qué es necesario el caching?
\nSin caché, cada solicitud de datos implica una lectura desde un almacenamiento lento (BD, API externa). La caché almacena los datos solicitados con frecuencia en memoria rápida (in-process o in-memory), lo que proporciona:
\n- \n
- Aceleración del acceso de 10 a 100 veces \n
- Reducción de la carga en la BD \n
- Aumento del rendimiento del sistema \n
- Ahorro de recursos \n
1. Redis — caché distribuido
\nRedis es un almacén de datos en memoria que funciona como un servidor independiente. Admite estructuras de datos complejas (cadenas, listas, conjuntos, hashes) y mecanismos de caducidad de claves (TTL). Para Java se utilizan los clientes Jedis o Lettuce.
Ejemplo de uso de Redis con Jedis
\nimport redis.clients.jedis.Jedis;\n\npublic class RedisCacheExample {\n public static void main(String[] args) {\n try (Jedis jedis = new Jedis("localhost", 6379)) {\n // Establecemos un valor con TTL de 60 segundos\n jedis.setex("user:123", 60, "{\\"name\\":\\"Alice\\",\\"role\\":\\"admin\\"}");\n\n // Leemos el valor\n String userData = jedis.get("user:123");\n System.out.println("Datos en caché: " + userData);\n\n // Verificamos si la clave existe\n System.out.println("La clave existe: " + jedis.exists("user:123"));\n }\n }\n}\n\nVentajas de Redis:
\n- \n
- Soporte para clustering y replicación \n
- Persistencia (RDB, AOF) \n
- Amplio conjunto de comandos (INCR, SORT, PUB/SUB) \n
- Excelente integración con Spring Boot mediante
spring-boot-starter-data-redis\n
Desventajas:
\n- \n
- Latencia de red (proceso separado) \n
- Requiere administración \n
- No es adecuado para cachés con volúmenes de datos muy pequeños (overhead de conexión) \n
2. Ehcache — caché in-process maduro
\nEhcache es una de las bibliotecas de caching más antiguas para Java. Funciona dentro de la JVM, admite almacenamiento en disco (BigMemory) y es totalmente compatible con JCache (JSR-107). Es ideal para aplicaciones monolíticas.
\n\nEjemplo de configuración de Ehcache mediante XML
\n<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"\n xmlns="http://www.ehcache.org/v3"\n xsi:schemaLocation="http://www.ehcache.org/v3 http://www.ehcache.org/schema/ehcache-core-3.10.xsd">\n <cache alias="users">\n <key-type>java.lang.String</key-type>\n <value-type>java.lang.String</value-type>\n <heap>1000</heap>\n <expiry>\n <ttl unit="seconds">300</ttl>\n </expiry>\n </cache>\n</config>\n\nEjemplo de uso de Ehcache en código
\nimport org.ehcache.Cache;\nimport org.ehcache.CacheManager;\nimport org.ehcache.config.builders.CacheManagerBuilder;\nimport org.ehcache.xml.XmlConfiguration;\n\npublic class EhcacheExample {\n public static void main(String[] args) {\n XmlConfiguration xmlConfig = new XmlConfiguration(\n EhcacheExample.class.getResource("/ehcache.xml"));\n try (CacheManager cacheManager = CacheManagerBuilder.newCacheManager(xmlConfig)) {\n cacheManager.init();\n Cache<String, String> users = cacheManager.getCache("u