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

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

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

开始课程

介绍:为什么需要在 Java 中进行缓存?



现代 Java 应用程序在处理数据库、外部 API 或复杂计算时,经常会遇到性能问题。每次对慢速资源的重复请求都会增加响应时间和基础设施负载。这个问题的解决方案是——缓存。



Java 中的缓存允许将频繁请求的数据临时存储在快速访问区域(通常是 RAM 中),以便在重复请求时能够立即返回,绕过昂贵的操作。这对于高负载系统、Web 应用程序和微服务至关重要。



在本文中,我们将分析 Java 中三种主要的缓存方法:分布式解决方案 (Redis, Memcached) 和 内置 (in-memory) 缓存。您将了解何时选择哪种工具,并看到每种工具的代码示例。



1. Java 中的内置缓存:Ehcache, Caffeine 和 HashMap



内置缓存是在应用程序的 JVM 内部运行的库。它们不需要安装外部服务器,非常适合单体应用程序或数据量较小的微服务。



1.1. 基于 HashMap 的最简单缓存(不适用于生产环境)



最简单的方法是使用 ConcurrentHashMap。但这种方法没有清理机制、TTL(生存时间)和内存控制。

import java.util.concurrent.ConcurrentHashMap;

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

public V get(K key) { return cache.get(key); }

public void put(K key, V value) { cache.put(key, value); }

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


缺点:没有自动清理,可能导致 OutOfMemoryError。



1.2. Caffeine — Java 中的现代标准



Caffeine 是一个用于 Java 8+ 的高性能缓存库。它支持基于时间、大小和使用频率的自动清理。



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) .build();

// 写入 cache.put("user:123", "John Doe");

// 读取 String user = cache.getIfPresent("user:123"); System.out.println("Cached user: " + user); }}


Caffeine 的优点:高速、可配置的淘汰策略 (LRU, LFU)、异步加载。



1.3. Ehcache — 久经考验



Ehcache 是 Java 最古老的缓存库之一。支持磁盘存储和集群。



import org.ehcache.Cache;import org.ehcache.CacheManager;import org.ehcache.config.builders.CacheConfigurationBuilder;import org.ehcache.config.builders.CacheManagerBuilder;import org.ehcache.config.builders.ResourcePoolsBuilder;

public class EhcacheExample { public static void main(String[] args) { CacheManager cacheManager = CacheManagerBuilder.newCacheManagerBuilder() .withCache("myCache", CacheConfigurationBuilder.newCacheConfigurationBuilder( String.class, String.class, ResourcePoolsBuilder.heap(100))) .build(); cacheManager.init();

Cache<String, String> cache = cacheManager.getCache("m

博客

书籍推荐