Google Guava Cache 移除监听器
2019獨角獸企業重金招聘Python工程師標準>>>
首先說明幾點內容,以便更容易理解。
1:設置 ?expireAfterAccess(long, TimeUnit) 緩存元素在指定的時間沒有被讀取訪問失效,或 設置?expireAfterWrite(long, TimeUnit) 緩存元素在指定的時間沒有被寫入訪問失效,如果設置?removalListener(removalListener) 移除監聽器,則失效元素在被移除時觸發移除監聽器。注意 設置元素的定時無操作失效后,元素并不會在時間到達后就主動失效觸動移除監聽器。而是在后續的訪問或寫入時,捎帶著把先前放入的元素過期后進行驅逐。仔細想想這么做確實很巧妙。不用需要一個固定線程掃描緩存中的過期元素以免與用戶的操作產生鎖競爭。但是想讓緩存中元素過期后就馬上觸發移除操作處理的就無能為力了。試想下,如果一個緩存設置元素5分鐘無寫入訪問失效,那么5分鐘之前寫入緩存一個元素M,在接下來的5分鐘之后如果沒有對緩存的操作,那么這個元素就一直停留在緩存中,也不會觸發移除監聽,直到下次操作緩存時。
想要讓緩存元素過期后就馬上驅逐的,或過期后就觸發移除監聽器的,可以創建一個自己的維護線程,以固定的時間間隔調用?Cache.cleanUp(),現在問題來了,我以固定時間 間隔調用Cache.cleanUp() 觸發了移除監聽事件(說明移除了元素),但是在我后續的寫入緩存操作時,又觸發了次同一個元素的移除監聽事件。知道原因的期待你的回答。
語言表述能力比較差,直接上代碼
/*失效元素從緩存清除,監聽事件?(同步通知)*/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()/*并發操作線程??默認4*/.concurrencyLevel(2)/*15秒無寫入過期*/.expireAfterWrite(15,?TimeUnit.SECONDS)/*最大元素個數1000,?元素個數接近臨界點時,將按照LRU策略進行驅逐*/.maximumSize(1000)/*同步通知監聽*/.removalListener(removalListener)/*異步通知監聽*/ // ????.removalListener(removalListenerBuild()).build(); /*周期性線程池*/private?static?ScheduledExecutorService?executorService?=?Executors.newScheduledThreadPool(1);protected?void?executeCleanCache()?{/*參數說明*?執行的線程任務*?初始化延遲1分則后執行*?每隔1分鐘執行一次清除,本次執行結束后延遲1分鐘開始下次執行*?時間單位(分鐘)*?*/executorService.scheduleWithFixedDelay(new?ClearUpExpired(),?1L,?1L,?TimeUnit.MINUTES);}/***?@Description:?TODO?任務執行完畢之后,關閉調度線程池*?@author?LWB*?create?on?2014年12月22日??上午9:50:50*?@Title:?shutdown?void*/protected?void?shutdown()?{executorService.shutdown();}/***?@Description:?TODO?立即關閉所有正在執行的線程*?@author?LWB*?create?on?2014年12月22日??上午9:53:16*?@Title:?shutdownNow?void*/protected?void?shutdownNow()?{executorService.shutdownNow();}/***?清除過期的緩存元素*?@author??LWB*?@version?1.0*?Create?on??2014年12月21日??下午10:01:18?*?網絡配貨服務技術有限公司??Copyright?2014*/private?class?ClearUpExpired?implements?Runnable?{@Overridepublic?void?run()?{cache.cleanUp();}}日志為證
轉載于:https://my.oschina.net/linwenbin/blog/359133
總結
以上是生活随笔為你收集整理的Google Guava Cache 移除监听器的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 通俗易懂地解决中文乱码问题(2) ---
- 下一篇: 用nodejs搭建最简单、轻量化的htt