Java中的缓存:Redis及其他解决方案
缓存是Java应用程序中优化性能的关键技术之一。它可以减少响应时间,降低数据库和外部API的负载。在本文中,我们将介绍流行的缓存工具:Redis、Caffeine、Ehcache以及Spring Cache的内置功能。
为什么Java需要缓存?
没有缓存,每次数据访问都可能引发昂贵的操作:SQL查询、REST API调用或复杂计算。缓存将这些操作的结果存储在快速访问区域(内存或分布式存储)中,从而带来以下好处:
- 减少响应时间(延迟)
- 降低后端负载
- 节省服务器资源
- 在高负载下实现可扩展性
1. Redis — 分布式缓存
Redis 是一种内存数据存储,通常用作分布式缓存。它支持复杂的数据结构:字符串、列表、集合、哈希和有序集合。Java有流行的客户端 Jedis 和更现代的 Lettuce。
通过Jedis连接Redis
在 pom.xml 中添加依赖:
<dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>5.0.2</version></dependency>使用Redis缓存的示例:
import redis.clients.jedis.Jedis;
public class RedisCacheExample { public static void main(String[] args) { try (Jedis jedis = new Jedis("localhost", 6379)) { // 使用TTL(生存时间)保存数据 jedis.setex("user:123", 3600, "{\\"name\\":\\"伊万\\",\\"age\\":30}");
// 从缓存中读取 String cachedUser = jedis.get("user:123"); System.out.println("来自缓存: " + cachedUser);
// 检查键是否存在 if (jedis.exists("user:123")) { System.out.println("键存在"); } } }}Redis的优点:分布式、持久化、支持TTL、发布/订阅、集群。 缺点:需要单独的服务器、对象序列化。
2. Caffeine — 高性能本地缓存
Caffeine 是一个用于Java内存缓存的现代库。它基于W-TinyLFU算法,在低内存消耗下提供高效率。Caffeine通常用作Spring Boot 2.x和3.x中的默认缓存。
Caffeine示例
import com.github.benmanes.caffeine.cache.Cache;import com.github.benmanes.caffeine.cache.Caffeine;import java.util.concurrent.TimeUnit;
public class CaffeineCacheExample { public static void main(String[] args) { Cache<String, String> cache = Caffeine.newBuilder() .expireAfterWrite(10, TimeUnit.MINUTES) .maximumSize(10_000) .recordStats() .build();
// 写入 cache.put("product:42", "戴尔XPS 15笔记本电脑");
// 带回退的读取 String product = cache.get("product:42", key -> loadFromDB(key)); System.out.println("商品: " + product);
// 统计信息 System.out.println("命中次数: " + cache.stats().hitCount()); }
private static String loadFromDB(String key) { // 模拟从数据库加载 return "键为 " + key + " 的商品"; }}Caffeine的优点:高速、自动驱逐、统计信息、与Spring集成。 缺点:仅限本地(非分布式)。
3. Ehcache — 成熟的本地缓存
Ehcache