日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

Google Guava Cache 移除监听器

發(fā)布時(shí)間:2025/4/5 编程问答 56 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Google Guava Cache 移除监听器 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

2019獨(dú)角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>

首先說(shuō)明幾點(diǎn)內(nèi)容,以便更容易理解。

1:設(shè)置 ?expireAfterAccess(long, TimeUnit) 緩存元素在指定的時(shí)間沒(méi)有被讀取訪問(wèn)失效,或 設(shè)置?expireAfterWrite(long, TimeUnit) 緩存元素在指定的時(shí)間沒(méi)有被寫入訪問(wèn)失效,如果設(shè)置?removalListener(removalListener) 移除監(jiān)聽(tīng)器,則失效元素在被移除時(shí)觸發(fā)移除監(jiān)聽(tīng)器。注意 設(shè)置元素的定時(shí)無(wú)操作失效后,元素并不會(huì)在時(shí)間到達(dá)后就主動(dòng)失效觸動(dòng)移除監(jiān)聽(tīng)器。而是在后續(xù)的訪問(wèn)或?qū)懭霑r(shí),捎帶著把先前放入的元素過(guò)期后進(jìn)行驅(qū)逐。仔細(xì)想想這么做確實(shí)很巧妙。不用需要一個(gè)固定線程掃描緩存中的過(guò)期元素以免與用戶的操作產(chǎn)生鎖競(jìng)爭(zhēng)。但是想讓緩存中元素過(guò)期后就馬上觸發(fā)移除操作處理的就無(wú)能為力了。試想下,如果一個(gè)緩存設(shè)置元素5分鐘無(wú)寫入訪問(wèn)失效,那么5分鐘之前寫入緩存一個(gè)元素M,在接下來(lái)的5分鐘之后如果沒(méi)有對(duì)緩存的操作,那么這個(gè)元素就一直停留在緩存中,也不會(huì)觸發(fā)移除監(jiān)聽(tīng),直到下次操作緩存時(shí)。

想要讓緩存元素過(guò)期后就馬上驅(qū)逐的,或過(guò)期后就觸發(fā)移除監(jiān)聽(tīng)器的,可以創(chuàng)建一個(gè)自己的維護(hù)線程,以固定的時(shí)間間隔調(diào)用?Cache.cleanUp(),現(xiàn)在問(wèn)題來(lái)了,我以固定時(shí)間 間隔調(diào)用Cache.cleanUp() 觸發(fā)了移除監(jiān)聽(tīng)事件(說(shuō)明移除了元素),但是在我后續(xù)的寫入緩存操作時(shí),又觸發(fā)了次同一個(gè)元素的移除監(jiān)聽(tīng)事件。知道原因的期待你的回答。

語(yǔ)言表述能力比較差,直接上代碼

/*失效元素從緩存清除,監(jiān)聽(tīng)事件?(同步通知)*/static?RemovalListener<String,?OrderInfo>?removalListener?=?new?RemovalListener<String,?OrderInfo>()?{public?void?onRemoval(RemovalNotification<String,?OrderInfo>?notification)?{OrderInfo?orderInfo?=?notification.getValue();logger.info("remove?cause?"?+?notification.getCause()?+?"?"?+?orderInfo.toString());}}; /*訂單緩存*/public?static?Cache<String,?OrderInfo>?cache?=?CacheBuilder.newBuilder()/*并發(fā)操作線程??默認(rèn)4*/.concurrencyLevel(2)/*15秒無(wú)寫入過(guò)期*/.expireAfterWrite(15,?TimeUnit.SECONDS)/*最大元素個(gè)數(shù)1000,?元素個(gè)數(shù)接近臨界點(diǎn)時(shí),將按照LRU策略進(jìn)行驅(qū)逐*/.maximumSize(1000)/*同步通知監(jiān)聽(tīng)*/.removalListener(removalListener)/*異步通知監(jiān)聽(tīng)*/ // ????.removalListener(removalListenerBuild()).build(); /*周期性線程池*/private?static?ScheduledExecutorService?executorService?=?Executors.newScheduledThreadPool(1);protected?void?executeCleanCache()?{/*參數(shù)說(shuō)明*?執(zhí)行的線程任務(wù)*?初始化延遲1分則后執(zhí)行*?每隔1分鐘執(zhí)行一次清除,本次執(zhí)行結(jié)束后延遲1分鐘開(kāi)始下次執(zhí)行*?時(shí)間單位(分鐘)*?*/executorService.scheduleWithFixedDelay(new?ClearUpExpired(),?1L,?1L,?TimeUnit.MINUTES);}/***?@Description:?TODO?任務(wù)執(zhí)行完畢之后,關(guān)閉調(diào)度線程池*?@author?LWB*?create?on?2014年12月22日??上午9:50:50*?@Title:?shutdown?void*/protected?void?shutdown()?{executorService.shutdown();}/***?@Description:?TODO?立即關(guān)閉所有正在執(zhí)行的線程*?@author?LWB*?create?on?2014年12月22日??上午9:53:16*?@Title:?shutdownNow?void*/protected?void?shutdownNow()?{executorService.shutdownNow();}/***?清除過(guò)期的緩存元素*?@author??LWB*?@version?1.0*?Create?on??2014年12月21日??下午10:01:18?*?網(wǎng)絡(luò)配貨服務(wù)技術(shù)有限公司??Copyright?2014*/private?class?ClearUpExpired?implements?Runnable?{@Overridepublic?void?run()?{cache.cleanUp();}}

日志為證


轉(zhuǎn)載于:https://my.oschina.net/linwenbin/blog/359133

總結(jié)

以上是生活随笔為你收集整理的Google Guava Cache 移除监听器的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。