Java高性能緩存框架之Caffeine詳解
Caffeine緩存框架
Caffeine是一個(gè)基于Java8的高性能緩存框架,號稱趨于完美。
Caffeine受啟發(fā)于Guava Cache的API,使用API和Guava是一致的。
它借鑒了Guava Cache和ConcurrentLinkedHashMap的設(shè)計(jì)經(jīng)驗(yàn)。
在Springboot中使用Caffeine
在工程的pom文件引入caffeine的依賴,如下:
<dependency>
<groupId>com.github.ben-manes.caffeine</groupId>
<artifactId>caffeine</artifactId>
<version>2.6.2</version>
</dependency>創(chuàng)建一個(gè)抽象類AbstractCaffineCache,該類使用范型來約束緩存的數(shù)據(jù)類型,并實(shí)現(xiàn)了三個(gè)方法,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è)置了緩存過期的時(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)過固定時(shí)間過期
* expireAfterWrite=[duration]: 最后一次寫入后經(jīng)過固定時(shí)間過期
* refreshAfterWrite=[duration]: 創(chuàng)建緩存或者最近一次更新緩存后經(jīng)過固定的時(shí)間間隔,刷新緩存
* recordStats:開發(fā)統(tǒng)計(jì)功能
*
* @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)過固定時(shí)間過期
- expireAfterWrite=[duration]: 最后一次寫入后經(jīng)過固定時(shí)間過期
- refreshAfterWrite=[duration]: 創(chuàng)建緩存或者最近一次更新緩存后經(jīng)過固定的時(shí)間間隔,刷新緩存
- recordStats:開發(fā)統(tǒng)計(jì)功能
注意: expireAfterWrite和expireAfterAccess同時(shí)存在時(shí),以expireAfterWrite為準(zhǔn)。
到此這篇關(guān)于Java高性能緩存框架之Caffeine詳解的文章就介紹到這了,更多相關(guān)緩存框架Caffeine內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java泛型與數(shù)據(jù)庫應(yīng)用實(shí)例詳解
這篇文章主要介紹了Java泛型與數(shù)據(jù)庫應(yīng)用,結(jié)合實(shí)例形式詳細(xì)分析了java繼承泛型類實(shí)現(xiàn)增刪改查操作相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2019-08-08
Nacos框架服務(wù)注冊實(shí)現(xiàn)流程
這篇文章主要介紹了SpringCloud服務(wù)注冊之nacos實(shí)現(xiàn)過程,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-08-08
Java跳出當(dāng)前的多重嵌套循環(huán)的五種方法
在Java編程中,跳出多重嵌套循環(huán)可以使用break語句、標(biāo)號與break組合、return語句、標(biāo)志變量和異常處理五種方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-10-10
WebSocket獲取httpSession空指針異常的解決辦法
這篇文章主要介紹了在使用WebSocket實(shí)現(xiàn)p2p或一對多聊天功能時(shí),如何獲取HttpSession來獲取用戶信息,本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),感興趣的朋友一起看看吧2025-01-01
Java根據(jù)日期截取字符串的多種實(shí)現(xiàn)方法
在實(shí)際開發(fā)中,我們經(jīng)常會(huì)遇到需要根據(jù)日期來截取字符串的需求,例如從文件名中提取日期信息,Java 提供了多種方法來實(shí)現(xiàn)根據(jù)日期來截取字符串的功能,本文將給大家介紹了Java根據(jù)日期截取字符串的多種實(shí)現(xiàn)方法,需要的朋友可以參考下2024-11-11
java基于數(shù)據(jù)庫實(shí)現(xiàn)全局唯一ID的示例
本文主要介紹了java基于數(shù)據(jù)庫實(shí)現(xiàn)全局唯一ID的示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-04-04
Java Collection 移除元素方法及注意事項(xiàng)
這篇文章主要介紹了Java Collection 移除元素方法及注意事項(xiàng),通過一個(gè)簡單實(shí)例給大家講解,需要的朋友可以參考下2020-01-01
基于SpringBoot和Vue實(shí)現(xiàn)分片上傳系統(tǒng)
最近想做一個(gè)關(guān)于文件上傳的個(gè)人小網(wǎng)盤,一開始嘗試使用了OSS的方案,但是該方案對于大文件來說并不友好,所以開始嘗試分片上傳方案的探索,接下來小編給大家詳細(xì)的介紹一下如何基于SpringBoot和Vue實(shí)現(xiàn)分片上傳系統(tǒng),需要的朋友可以參考下2023-12-12
java中public class與class的區(qū)別詳解
以下是對java中public class與class的區(qū)別進(jìn)行了分析介紹,需要的朋友可以過來參考下2013-07-07

