SpringBoot3已經把EhCache從框架中刪除了,SpringBoot3默認的緩存組件為Caffeine,那么我們在SpringBoot3中如何去使用它了?
1.添加依賴
<dependency><groupId>com.github.ben-manes.caffeine</groupId><artifactId>caffeine</artifactId><version>3.1.8</version>
</dependency>
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-cache</artifactId>
</dependency>
2.配置Caffeine緩存
創建Caffeine配置類
import com.github.benmanes.caffeine.cache.Caffeine;
import org.springframework.cache.CacheManager;
import org.springframework.cache.caffeine.CaffeineCacheManager;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.concurrent.TimeUnit;@Configuration
public class CaffeineConfig {/*** 配置Caffeine緩存管理器*/@Beanpublic CacheManager cacheManager() {CaffeineCacheManager cacheManager = new CaffeineCacheManager();// 設置緩存默認配置cacheManager.setCaffeine(caffeineCacheBuilder());// 允許動態創建緩存cacheManager.setAllowNullValues(false);return cacheManager;}/*** 配置Caffeine緩存屬性* 可根據需要調整過期時間和最大緩存數量*/Caffeine<Object, Object> caffeineCacheBuilder() {return Caffeine.newBuilder()// 最后一次寫入后經過固定時間過期.expireAfterWrite(60, TimeUnit.MINUTES)// 最大緩存條目.maximumSize(10000)// 初始緩存容量.initialCapacity(100)// 記錄緩存命中率等統計信息.recordStats();}
}
3.添加工具類
添加Caffeine工具類
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.cache.Cache;
import org.springframework.cache.CacheManager;
import org.springframework.util.ObjectUtils;
import java.util.Iterator;
import java.util.List;
import java.util.Set;public class CaffeineUtils {private static final Logger logger = LoggerFactory.getLogger(CaffeineUtils.class);// 獲取Spring管理的緩存管理器private static final CacheManager cacheManager = SpringUtils.getBean(CacheManager.class);// 默認緩存名稱private static final String SYS_CACHE = "sys-cache";/*** 獲取SYS_CACHE緩存*/public static Object get(String key) {return get(SYS_CACHE, key);}/*** 獲取SYS_CACHE緩存,帶默認值*/public static Object get(String key, Object defaultValue) {Object value = get(key);return value != null ? value : defaultValue;}/*** 寫入SYS_CACHE緩存*/public static void put(String key, Object value) {put(SYS_CACHE, key, value);}/*** 從SYS_CACHE緩存中移除*/public static void remove(String key) {remove(SYS_CACHE, key);}/*** 從SYS_CACH緩存中移除指定key集合*/public static void removeByKeys(Set<String> keys) {removeByKeys(SYS_CACHE, keys);}/*** 獲取指定緩存*/public static Object get(String cacheName, String key) {Cache cache = getCache(cacheName);Cache.ValueWrapper wrapper = cache.get(getKey(key));return wrapper != null ? wrapper.get() : null;}/*** 獲取指定緩存,帶默認值*/public static Object get(String cacheName, String key, Object defaultValue) {Object value = get(cacheName, key);return value != null ? value : defaultValue;}/*** 寫入指定緩存*/public static void put(String cacheName, String key, Object value) {if (value != null) {getCache(cacheName).put(getKey(key), value);}}/*** 從指定緩存中移除*/public static void remove(String cacheName, String key) {getCache(cacheName).evict(getKey(key));}/*** 清空指定緩存*/public static void removeAll(String cacheName) {Cache cache = getCache(cacheName);// Caffeine不直接支持獲取所有key,如需此功能需自行維護key集合cache.clear();logger.info("清理緩存:{}", cacheName);}/*** 從指定緩存中移除指定key集合*/public static void removeByKeys(String cacheName, Set<String> keys) {Cache cache = getCache(cacheName);for (String key : keys) {cache.evict(getKey(key));}logger.info("清理緩存:{} => {}", cacheName, keys);}/*** 獲取緩存鍵名*/private static String getKey(String key) {return key;}/*** 獲取緩存實例*/public static Cache getCache(String cacheName) {Cache cache = cacheManager.getCache(cacheName);if (cache == null) {throw new RuntimeException("當前系統中沒有定義“" + cacheName + "”這個緩存。");}return cache;}/*** 獲取所有緩存名稱*/public static String[] getCacheNames() {return cacheManager.getCacheNames().toArray(new String[0]);}
}
4.注意事項
- Caffeine 不直接支持獲取緩存中的所有 key(getKeys()方法),如果需要此功能,需自行維護 key 集合
- 緩存配置(過期時間等)可以針對不同緩存名稱單獨配置,需要額外擴展
- 移除了allowNullValues的支持,建議緩存中不存儲 null 值
5.性能優勢
- Caffeine 基于 Java 8,使用更高效的算法(W-TinyLFU)
- 平均訪問時間更短,內存占用更優
- 支持異步加載等高級特性(如需可擴展實現)