Java高性能緩存框架之Caffeine詳解
Caffeine緩存框架
Caffeine是一個基于Java8的高性能緩存框架,號稱趨于完美。
Caffeine受啟發(fā)于Guava Cache的API,使用API和Guava是一致的。
它借鑒了Guava Cache和ConcurrentLinkedHashMap的設(shè)計經(jīng)驗。
在Springboot中使用Caffeine
在工程的pom文件引入caffeine的依賴,如下:
<dependency> <groupId>com.github.ben-manes.caffeine</groupId> <artifactId>caffeine</artifactId> <version>2.6.2</version> </dependency>
創(chuàng)建一個抽象類AbstractCaffineCache,該類使用范型來約束緩存的數(shù)據(jù)類型,并實現(xiàn)了三個方法,put、get、clear。
/** * @Author ZhuZiKai * @Description * @date 2022/3/7 10:44 */ public abstract class AbstractCaffeineCache<T> { protected LoadingCache<String, T> loadingCache; abstract LoadingCache<String, T> createLoadingCache(); public boolean put(String key, T value) { if (loadingCache == null) { loadingCache = createLoadingCache(); } loadingCache.put(key, value); return Boolean.TRUE; } public T get(String key) { if (loadingCache == null) { loadingCache = createLoadingCache(); } try { return loadingCache.get(key); } catch (Exception e) { return null; } } public boolean clear(String key) { if (loadingCache == null) { loadingCache = createLoadingCache(); } loadingCache.invalidate(key); return Boolean.TRUE; } }
創(chuàng)建MyCaffeineCache的緩存類,該類緩存類。創(chuàng)建LoadingCache類,該類設(shè)置了緩存過期的時間,最大的緩存?zhèn)€數(shù)。
/** * @Author ZhuZiKai * @Description * @date 2022/3/7 10:44 */ public class MyCaffeineCache extends AbstractCaffeineCache { /** * Caffeine配置說明: * initialCapacity=[integer]: 初始的緩存空間大小 * maximumSize=[long]: 緩存的最大條數(shù) * maximumWeight=[long]: 緩存的最大權(quán)重 * expireAfterAccess=[duration]: 最后一次寫入或訪問后經(jīng)過固定時間過期 * expireAfterWrite=[duration]: 最后一次寫入后經(jīng)過固定時間過期 * refreshAfterWrite=[duration]: 創(chuàng)建緩存或者最近一次更新緩存后經(jīng)過固定的時間間隔,刷新緩存 * recordStats:開發(fā)統(tǒng)計功能 * * @return */ @Override LoadingCache createLoadingCache() { loadingCache = Caffeine.newBuilder() .expireAfterWrite(1000L, TimeUnit.MILLISECONDS) .initialCapacity(10) .maximumSize(100) .recordStats() .build((CacheLoader<String, String>) key -> null); return loadingCache; } }
將MyCaffeineCache注入到spring ioc中,代碼如下:
/** * @Author ZhuZiKai * @Description * @date 2022/3/7 10:45 */ @Configuration public class CaffeineCacheConfig { @Bean public MyCaffeineCache MyCaffeineCache(){ return new MyCaffeineCache(); } }
如何使用。
/** * @Author ZhuZiKai * @Description * @date 2022/1/6 9:45 */ @Aspect @Component @Slf4j public class IdempotentAspect extends BaseController { @Resource private MyCaffeineCache cache; private static final ThreadLocalUtil threadLocalUtil = new ThreadLocalUtil(); @Around(value = "@annotation(idempotent)") public Object around(ProceedingJoinPoint joinPoint, Idempotent idempotent) throws Throwable { UserBO user = getUserBO(request); Integer userId = user.getUserId(); String userRequest = userId + request.getRequestURI(); threadLocalUtil.setLocalUserRequest(userRequest); Object uuid = cache.get(userRequest); VerifyUtils.throwWhen(uuid != null, idempotent.value()); return joinPoint.proceed(); } @AfterReturning(value = "@annotation(idempotent)") public void afterReturning(JoinPoint point, Idempotent idempotent) { try { cache.put(threadLocalUtil.getLocalUserRequest(), UUIDUtil.simpleUUID()); } finally { threadLocalUtil.clearLocalUserRequest(); } } }
使用本地緩存可以加快頁面響應(yīng)速度,緩存分布式緩存讀壓力,大量、高并發(fā)請求的網(wǎng)站比較適用
Caffeine配置說明:
- initialCapacity=[integer]: 初始的緩存空間大小
- maximumSize=[long]: 緩存的最大條數(shù)
- maximumWeight=[long]: 緩存的最大權(quán)重
- expireAfterAccess=[duration]: 最后一次寫入或訪問后經(jīng)過固定時間過期
- expireAfterWrite=[duration]: 最后一次寫入后經(jīng)過固定時間過期
- refreshAfterWrite=[duration]: 創(chuàng)建緩存或者最近一次更新緩存后經(jīng)過固定的時間間隔,刷新緩存
- recordStats:開發(fā)統(tǒng)計功能
注意: expireAfterWrite和expireAfterAccess同時存在時,以expireAfterWrite為準(zhǔn)。
到此這篇關(guān)于Java高性能緩存框架之Caffeine詳解的文章就介紹到這了,更多相關(guān)緩存框架Caffeine內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java泛型與數(shù)據(jù)庫應(yīng)用實例詳解
這篇文章主要介紹了Java泛型與數(shù)據(jù)庫應(yīng)用,結(jié)合實例形式詳細(xì)分析了java繼承泛型類實現(xiàn)增刪改查操作相關(guān)實現(xiàn)技巧,需要的朋友可以參考下2019-08-08Java跳出當(dāng)前的多重嵌套循環(huán)的五種方法
在Java編程中,跳出多重嵌套循環(huán)可以使用break語句、標(biāo)號與break組合、return語句、標(biāo)志變量和異常處理五種方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-10-10WebSocket獲取httpSession空指針異常的解決辦法
這篇文章主要介紹了在使用WebSocket實現(xiàn)p2p或一對多聊天功能時,如何獲取HttpSession來獲取用戶信息,本文結(jié)合實例代碼給大家介紹的非常詳細(xì),感興趣的朋友一起看看吧2025-01-01Java根據(jù)日期截取字符串的多種實現(xiàn)方法
在實際開發(fā)中,我們經(jīng)常會遇到需要根據(jù)日期來截取字符串的需求,例如從文件名中提取日期信息,Java 提供了多種方法來實現(xiàn)根據(jù)日期來截取字符串的功能,本文將給大家介紹了Java根據(jù)日期截取字符串的多種實現(xiàn)方法,需要的朋友可以參考下2024-11-11java基于數(shù)據(jù)庫實現(xiàn)全局唯一ID的示例
本文主要介紹了java基于數(shù)據(jù)庫實現(xiàn)全局唯一ID的示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-04-04基于SpringBoot和Vue實現(xiàn)分片上傳系統(tǒng)
最近想做一個關(guān)于文件上傳的個人小網(wǎng)盤,一開始嘗試使用了OSS的方案,但是該方案對于大文件來說并不友好,所以開始嘗試分片上傳方案的探索,接下來小編給大家詳細(xì)的介紹一下如何基于SpringBoot和Vue實現(xiàn)分片上傳系統(tǒng),需要的朋友可以參考下2023-12-12java中public class與class的區(qū)別詳解
以下是對java中public class與class的區(qū)別進行了分析介紹,需要的朋友可以過來參考下2013-07-07