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

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

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

开始课程

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



现代Java应用程序经常处理大量数据。每次对数据库或外部API的请求都会消耗时间和资源。如果没有缓存,随着负载增长,性能会下降,响应时间会增加。缓存允许将频繁请求的数据存储在快速访问位置(内存中),从而减少延迟并降低后端负载。



在Java中,有三种主要的缓存方法:内置解决方案(例如HashMap或Caffeine)、分布式系统(Redis和Memcached)。在本文中,我们将分析每一种方法,提供代码示例,并帮助您为项目选择最佳方案。



1. Java中的内置缓存



内置缓存是加速应用程序的最简单方法。数据直接存储在JVM内存中。主要优点:访问延迟最小,配置简单。缺点:容量有限(取决于堆大小),应用程序重启时数据会丢失。



1.1. 通过HashMap实现简单缓存



最基本的方案是使用ConcurrentHashMap并手动管理生命周期。适用于原型,但不适用于生产环境(没有自动清理,可能导致内存泄漏)。



import java.util.concurrent.ConcurrentHashMap;import java.util.concurrent.TimeUnit;

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

public void put(String key, Object value, long ttlMillis) { cache.put(key, new CacheEntry(value, System.currentTimeMillis() + ttlMillis)); }

public Object get(String key) { CacheEntry entry = cache.get(key); if (entry == null || System.currentTimeMillis() > entry.expiry) { cache.remove(key); return null; } return entry.value; }

private static class CacheEntry { private final Object value; private final long expiry; // 构造函数和getter方法 }}


1.2. Caffeine — 现代缓存库



Caffeine 是一个高性能的Java库,默认用于Spring Cache。它支持基于时间、大小的自动驱逐,以及加权元素。Caffeine比Guava Cache(它基于此创建)运行得更快。



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或Ehcache(它支持磁盘存储)。内置解决方案非常适合单实例的微服务和单体应用。



2. Memcached:Java的分布式缓存



Memcached 是一个运行在内存中的分布式缓存系统。它简单、快速,并支持水平扩展。主要特点:

  • 以键值对形式存储(最大值为1 MB)。
  • 不支持持久化(重启时数据丢失)。
  • 没有内置的身份验证和加密。

在Java中与Memcached配合使用,最常用的是SpyMemcached库或

博客

书籍推荐