Java中CaffeineCache自定義緩存時(shí)間的實(shí)現(xiàn)
1、POM文件依賴
<dependency> <groupId>com.github.ben-manes.caffeine</groupId> <artifactId>caffeine</artifactId> <version>3.1.0</version> </dependency>
2、聲明緩存
@Slf4j public class CaffeineCacheUtils { /** * 聲明緩存對(duì)象 */ private static final Cache<String, Object> CACHE = Caffeine.newBuilder() // 當(dāng)key和value都沒(méi)有引用時(shí)驅(qū)逐緩存 .weakKeys() .weakValues() // 最大容量 .maximumSize(10_000) // 固定存活時(shí)間24小時(shí) .expireAfterWrite(2 * 60 * 60 * 1000L, TimeUnit.MILLISECONDS) .build() // 構(gòu)建Caffeine緩存 ; }
3、緩存使用
/** * 添加緩存 * * @param key key值 * @param value value值 */ public static void put(String key, Object value) { CACHE.put(key, value); } /** * 獲取緩存對(duì)象 * * @param key key值 * @return 返回value值 */ public static Object get(String key) { return CACHE.getIfPresent(key); }
4、測(cè)試緩存
@Test public void testCache() { CaffeineCacheUtils.put("key", "value"); Object value = CaffeineCacheUtils.get("key"); log.info("value={}", value); }
5、自定義緩存過(guò)期時(shí)間
expireAfterWrite是指定一個(gè)固定的過(guò)期時(shí)間,如果想要根據(jù)不同的key值自己指定過(guò)期時(shí)間,可以按照下面的方法來(lái)實(shí)現(xiàn)。
聲明一個(gè)緩存value值holder對(duì)象
@Data public class CacheValueHolder implements Serializable { @Serial private static final long serialVersionUID = 1398783661313031605L; private Object value; private TimeUnit timeUnit; private long expire; }
創(chuàng)建緩存容器
/** * 聲明緩存對(duì)象 */ private static final Cache<String, CacheValueHolder> CACHE = Caffeine.newBuilder() // 當(dāng)key和value都沒(méi)有引用時(shí)驅(qū)逐緩存 .weakKeys() .weakValues() // 最大容量 .maximumSize(10_000) .expireAfter(new Expiry<String, CacheValueHolder>() { @Override public long expireAfterCreate(String key, CacheValueHolder valueHolder, long currentTime) { log.info("創(chuàng)建緩存對(duì)象,key={},value={},currentTime={}", key, JSON.toJSONString(valueHolder), currentTime); return valueHolder.getTimeUnit().toNanos(valueHolder.getExpire()); } @Override public long expireAfterUpdate(String key, CacheValueHolder valueHolder, long currentTime, @NonNegative long currentDuration) { log.info("更新緩存對(duì)象,key={},value={},currentTime={},currentDuration={}", key, JSON.toJSONString(valueHolder), currentTime, currentDuration); return valueHolder.getTimeUnit().toNanos(valueHolder.getExpire()); } @Override public long expireAfterRead(String key, CacheValueHolder valueHolder, long currentTime, @NonNegative long currentDuration) { log.info("讀取緩存對(duì)象,key={},value={},currentTime={},currentDuration={}", key, JSON.toJSONString(valueHolder), currentTime, currentDuration); return currentDuration; } }) // 如果緩存不存在,則同步查詢事業(yè)部產(chǎn)品列表,同時(shí)加入緩存 .build() // 構(gòu)建Caffeine緩存 ;
修改緩存使用方法
/** * 添加緩存 * * @param key key值 * @param value value值 * @param expire 過(guò)期時(shí)間 * @param timeUnit 時(shí)間類型 */ public static void put(String key, Object value, long expire, TimeUnit timeUnit) { CacheValueHolder valueHolder = new CacheValueHolder(); valueHolder.setValue(value); valueHolder.setExpire(expire); valueHolder.setTimeUnit(timeUnit); CACHE.put(key, valueHolder); } /** * 添加緩存 * * @param key key值 * @param value value值 */ public static void put(String key, Object value) { // 默認(rèn)緩存存在時(shí)間為1000毫秒 put(key, value, 1000, TimeUnit.MILLISECONDS); } /** * 獲取緩存對(duì)象 * * @param key key值 * @return 返回value值 */ public static Object get(String key) { CacheValueHolder valueHolder = CACHE.getIfPresent(key); if (Objects.isNull(valueHolder)) { return null; } return valueHolder.getValue(); }
6、測(cè)試自定義超時(shí)時(shí)間
@Test public void testCache() throws InterruptedException { CaffeineCacheUtils.put("key1", "value1", 1000L, TimeUnit.MILLISECONDS); CaffeineCacheUtils.put("key2", "value2", 2000L, TimeUnit.MILLISECONDS); Object value1 = CaffeineCacheUtils.get("key1"); Object value2 = CaffeineCacheUtils.get("key2"); log.info("value1={}", value1); log.info("value2={}", value2); TimeUnit.MILLISECONDS.sleep(1000L); Object value11 = CaffeineCacheUtils.get("key1"); Object value22 = CaffeineCacheUtils.get("key2"); log.info("value1={}", value11); log.info("value2={}", value22); }
方法運(yùn)行后日志為:
23:44:21.398 [main] INFO com.summer.toolkit.util.CaffeineCacheUtils - 創(chuàng)建緩存對(duì)象,key=key1,value={"expire":1000,"timeUnit":"MILLISECONDS","value":"value1"},currentTime=8165196876700
23:44:21.401 [main] INFO com.summer.toolkit.util.CaffeineCacheUtils - 創(chuàng)建緩存對(duì)象,key=key2,value={"expire":2000,"timeUnit":"MILLISECONDS","value":"value2"},currentTime=8165240503500
23:44:21.401 [main] INFO com.summer.toolkit.util.CaffeineCacheUtils - 讀取緩存對(duì)象,key=key1,value={"expire":1000,"timeUnit":"MILLISECONDS","value":"value1"},currentTime=8165240686100,currentDuration=956190600
23:44:21.403 [main] INFO com.summer.toolkit.util.CaffeineCacheUtils - 讀取緩存對(duì)象,key=key2,value={"expire":2000,"timeUnit":"MILLISECONDS","value":"value2"},currentTime=8165242670700,currentDuration=1997832800
23:44:21.403 [main] INFO com.summer.toolkit.service.CaffeineCacheUtilsTest - value1=value1
23:44:21.403 [main] INFO com.summer.toolkit.service.CaffeineCacheUtilsTest - value2=value2
23:44:22.410 [main] INFO com.summer.toolkit.util.CaffeineCacheUtils - 讀取緩存對(duì)象,key=key2,value={"expire":2000,"timeUnit":"MILLISECONDS","value":"value2"},currentTime=8166249659500,currentDuration=990844000
23:44:22.411 [main] INFO com.summer.toolkit.service.CaffeineCacheUtilsTest - value1=null
23:44:22.412 [main] INFO com.summer.toolkit.service.CaffeineCacheUtilsTest - value2=value2
可以看到同時(shí)放入緩存容器中的兩個(gè)緩存,一個(gè)1000毫秒的過(guò)期時(shí)間,一個(gè)2000毫秒的過(guò)期時(shí)間,當(dāng)剛放入時(shí)都可以獲取到,等待1000毫秒后,只有第二個(gè)緩存可以獲取到,第一個(gè)緩存對(duì)象已經(jīng)過(guò)期獲取不到,實(shí)現(xiàn)了用戶自定義緩存對(duì)象過(guò)期時(shí)間。
到此這篇關(guān)于Java中CaffeineCache自定義緩存時(shí)間的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Java CaffeineCache緩存 內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringMVC配置javaConfig及StringHttpMessageConverter示例
這篇文章主要介紹了SpringMVC配置javaConfig及StringHttpMessageConverter實(shí)現(xiàn)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-07-07springboot集成JWT之雙重token的實(shí)現(xiàn)
本文主要介紹了springboot集成JWT之雙重token的實(shí)現(xiàn),前端使用accessToken進(jìn)行登錄和驗(yàn)證,后端使用refreshToken定期更新accessToken,具有一定的參考價(jià)值,感興趣的可以了解一下2025-03-03Jenkins集成sonarQube實(shí)現(xiàn)代碼質(zhì)量檢查過(guò)程圖解
這篇文章主要介紹了Jenkins集成sonarQube實(shí)現(xiàn)代碼質(zhì)量檢查過(guò)程圖解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-09-09Java中的StringBuilder()常見(jiàn)方法詳解
StringBuilder是一個(gè)可變的字符序列,此類提供一個(gè)與 StringBuffer 兼容的 API,但不保證同步,這篇文章主要介紹了StringBuilder()常見(jiàn)方法,需要的朋友可以參考下2023-09-09windows命令行中java和javac、javap使用詳解(java編譯命令)
最近重新復(fù)習(xí)了一下java基礎(chǔ),這里便講講對(duì)于一個(gè)類文件如何編譯、運(yùn)行、反編譯的。也讓自己加深一下印象2014-03-03StringUtils工具包中字符串非空判斷isNotEmpty和isNotBlank的區(qū)別
今天小編就為大家分享一篇關(guān)于StringUtils工具包中字符串非空判斷isNotEmpty和isNotBlank的區(qū)別,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2018-12-12