Google Guava Cache 移除监听器
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)題。
- 上一篇: 通俗易懂地解决中文乱码问题(2) ---
- 下一篇: 用nodejs搭建最简单、轻量化的htt