Java中的缓存:Redis、Memcached及内置解决方案从A到Z

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

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

开始课程

Java中的缓存:Redis、Memcached及内置解决方案:从A到Z



缓存是提升Java应用程序性能的关键工具之一。它可以缩短响应时间,降低数据库和外部API的负载,并改善用户体验。在本文中,我们将探讨Java中三种主要的缓存方法:内置解决方案(ConcurrentHashMap、Caffeine、Ehcache)、分布式系统(Redis)和轻量级网络缓存(Memcached)。您将了解何时选择哪种方案,并获得现成的代码示例。



什么是缓存以及为什么在Java中需要它?



缓存是将频繁请求的数据临时存储在快速存储介质(通常是内存)中。在Java中,这一点尤其适用于:

  • 降低延迟 — 从缓存返回数据只需微秒,而不是毫秒(如从数据库获取)。
  • 减轻资源负载 — 数据库、外部服务和磁盘的工作量减少。
  • 节省资源 — 更少的CPU和I/O操作。

缓存的主要指标:hit ratio(命中率)和TTL(生存时间)。



内置解决方案:从简单到高级



对于小型项目或单线程场景,可以使用简单的数据结构。然而,对于工业级应用程序,专用库更为合适。



1. ConcurrentHashMap — 基础缓存

最简单的方法是使用ConcurrentHashMap。它是线程安全的,但没有自动清理机制(TTL、淘汰策略)。

import java.util.concurrent.ConcurrentHashMap;

public class SimpleCache { private final ConcurrentHashMap<String, Object> cache = new ConcurrentHashMap<>();

public void put(String key, Object value) { cache.put(key, value); }

public Object get(String key) { return cache.get(key); }

public void evict(String key) { cache.remove(key); }

public void clear() { cache.clear(); }}

优点:简单,零依赖。
缺点:无自动失效,手动内存管理。



2. Caffeine — 现代高性能缓存

Caffeine库是Java中内存缓存的事实标准。它支持:

  • 基于时间(TTL)和大小的自动淘汰。
  • 异步加载。
  • 统计信息(命中率、未命中率)。
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(1000) .recordStats() // 用于收集统计信息 .build();

// 添加 cache.put("user:1", "Alice");

// 获取并自动加载 String value = cache.get("user:2", key -> loadFromDB(key)); System.out.println(value); }

private static String loadFromDB(String key) { // 模拟从数据库加载 return "Bob"; }}

优点:高性能,灵活,体积小(约600KB)。
缺点:仅限本地(非分布式)。



3. Ehcache — 强大的进程内缓存

Ehcache是一个成熟的库(Hibernate的一部分)。支持: