引言:为什么 Java 需要缓存?
\n在现代高并发开发中,数据访问速度是一个关键因素。每次对数据库或外部 API 的请求都会增加响应时间和基础设施负载。Java 缓存允许将频繁请求的数据存储在高速内存(RAM)中,将响应时间从几十毫秒缩短到微秒级。
\n在本文中,我们将探讨三种主要的缓存方法:内置解决方案(HashMap、Caffeine、Ehcache)、Redis 和 Memcached。您将了解如何选择合适的工具,并看到可运行的代码示例。
\n\n1. Java 内置缓存解决方案
\n对于小型项目或单线程应用程序,内置集合通常就足够了。然而,对于生产环境,最好使用专门的库。
\n\n1.1. 基于 HashMap 的简单缓存
\n最简单的方法是使用 ConcurrentHashMap 并手动管理生命周期。适用于原型,但没有淘汰机制(eviction)。
import java.util.concurrent.ConcurrentHashMap;\nimport java.util.concurrent.TimeUnit;\n\npublic class SimpleCache {\n private final ConcurrentHashMap<String, CacheEntry> cache = new ConcurrentHashMap<>();\n\n public void put(String key, Object value, long ttlMs) {\n cache.put(key, new CacheEntry(value, System.currentTimeMillis() + ttlMs));\n }\n\n public Object get(String key) {\n CacheEntry entry = cache.get(key);\n if (entry == null || System.currentTimeMillis() > entry.expiry) {\n cache.remove(key);\n return null;\n }\n return entry.value;\n }\n\n private record CacheEntry(Object value, long expiry) {}\n}\n\n1.2. Caffeine — 高性能 Java 缓存
\nCaffeine 是一个现代库,用于 Spring Cache。支持基于时间、大小和使用频率的自动淘汰。
\nimport com.github.benmanes.caffeine.cache.Cache;\nimport com.github.benmanes.caffeine.cache.Caffeine;\nimport java.util.concurrent.TimeUnit;\n\npublic class CaffeineExample {\n public static void main(String[] args) {\n Cache<String, String> cache = Caffeine.newBuilder()\n .expireAfterWrite(10, TimeUnit.MINUTES)\n .maximumSize(1000)\n .build();\n\n cache.put("user_1", "阿列克谢");\n String user = cache.getIfPresent("user_1");\n System.out.println(user); // 阿列克谢\n }\n}\n\n1.3. Ehcache — 企业级标准
\nEhcache 是一个成熟的解决方案,支持集群和磁盘持久化。通常与 Hibernate 一起使用。
\nimport org.ehcache.Cache;\nimport org.ehcache.CacheManager;\nimport org.ehcache.config.builders.CacheConfigurationBuilder;\nimport org.ehcache.config.builders.CacheManagerBuilder;\nimport org.ehcache.config.builders.ResourcePoolsBuilder;\n\npublic class EhcacheExample {\n public static void main(String[] args) {\n CacheManager cacheManager = CacheManagerBuilder.newCacheManagerBuilder()\n .withCache("users",\n CacheConfigurationBuilder.newCacheConfigurationBuilder(\n String.class, String.class,\n ResourcePoolsBuilder.heap(100))\n ).build();\n cacheManager.init();\n\n Cache<String, String> cache = cacheManager.getCache("users", String.class, String.class);\n cache.put("user_2", "玛丽亚");\n System.out.println(cache.get("user_2")); // 玛丽亚\n\n cacheManager.close();\n }\n}\n\n2. Redis — Java 分布式缓存
\nRedis 是一个内存数据存储,作为独立服