Java 缓存:Redis、Memcached 及内置解决方案从入门到精通

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

引言:为什么 Java 需要缓存?

\n

在现代高并发开发中,数据访问速度是一个关键因素。每次对数据库或外部 API 的请求都会增加响应时间和基础设施负载。Java 缓存允许将频繁请求的数据存储在高速内存(RAM)中,将响应时间从几十毫秒缩短到微秒级。

\n

在本文中,我们将探讨三种主要的缓存方法:内置解决方案(HashMap、Caffeine、Ehcache)、Redis 和 Memcached。您将了解如何选择合适的工具,并看到可运行的代码示例。

\n\n

1. Java 内置缓存解决方案

\n

对于小型项目或单线程应用程序,内置集合通常就足够了。然而,对于生产环境,最好使用专门的库。

\n\n

1.1. 基于 HashMap 的简单缓存

\n

最简单的方法是使用 ConcurrentHashMap 并手动管理生命周期。适用于原型,但没有淘汰机制(eviction)。

\n
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\n

1.2. Caffeine — 高性能 Java 缓存

\n

Caffeine 是一个现代库,用于 Spring Cache。支持基于时间、大小和使用频率的自动淘汰。

\n
import 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\n

1.3. Ehcache — 企业级标准

\n

Ehcache 是一个成熟的解决方案,支持集群和磁盘持久化。通常与 Hibernate 一起使用。

\n
import 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\n

2. Redis — Java 分布式缓存

\n

Redis 是一个内存数据存储,作为独立服

博客

书籍推荐