<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
在實際的專案開發中,我們經常會使用到快取中介軟體(如redis、MemCache等)來幫助我們提高系統的可用性和健壯性。
但是很多時候如果專案比較簡單,就沒有必要為了使用快取而專門引入Redis等等中介軟體來加重系統的複雜性。那麼Java本身有沒有好用的輕量級的快取元件呢。
答案當然是有嘍,而且方法不止一種。常見的解決方法有:ExpiringMap、LoadingCache及基於HashMap的封裝三種。
新增依賴(Maven)
<dependency> <groupId>net.jodah</groupId> <artifactId>expiringmap</artifactId> <version>0.5.8</version> </dependency>
範例原始碼
public class ExpiringMapApp { public static void main(String[] args) { // maxSize: 設定最大值,新增第11個entry時,會導致第1個立馬過期(即使沒到過期時間) // expiration:設定每個key有效時間10s, 如果key不設定過期時間,key永久有效。 // variableExpiration: 允許更新過期時間值,如果不設定variableExpiration,不允許後面更改過期時間,一旦執行更改過期時間操作會拋異常UnsupportedOperationException // policy: // CREATED: 只在put和replace方法清零過期時間 // ACCESSED: 在CREATED策略基礎上增加, 在還沒過期時get方法清零過期時間。 // 清零過期時間也就是重置過期時間,重新計算過期時間. ExpiringMap<String, String> map = ExpiringMap.builder() .maxSize(10) .expiration(10, TimeUnit.SECONDS) .variableExpiration().expirationPolicy(ExpirationPolicy.CREATED).build(); map.put("token", "lkj2412lj1412412nmlkjl2n34l23n4"); map.put("name", "管理員", 20000, TimeUnit.SECONDS); // 模擬執行緒等待... try { Thread.sleep(15000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("token ===> " + map.get("token")); System.out.println("name ===> " + map.get("name")); // 注意: 在建立map時,指定的那些引數如過期時間和過期策略都是全域性的, 對map中新增的每一個entry都適用. // 在put一個entry鍵值對時可以對當前entry 單獨設定 過期時間、過期策略,只對當前這個entry有效. } }
執行結果
token ===> null
name ===> 管理員
注意
在建立map時,指定的那些引數如過期時間和過期策略都是全域性的, 對map中新增的每一個entry都適用。
在put一個entry鍵值對時可以對當前entry 單獨設定 過期時間、過期策略,只對當前這個entry有效.
Google開源出來的一個執行緒安全的本地快取解決方案。
特點:提供快取回收機制,監控快取載入/命中情況,靈活強大的功能,簡單易上手的api。
原始碼
public class LoadingCacheApp { public static void main(String[] args) throws Exception { // maximumSize: 快取池大小,在快取項接近該大小時, Guava開始回收舊的快取項 // expireAfterAccess: 設定時間物件沒有被讀/寫存取則物件從記憶體中刪除(在另外的執行緒裡面不定期維護) // removalListener: 移除監聽器,快取項被移除時會觸發的勾點 // recordStats: 開啟Guava Cache的統計功能 LoadingCache<String, String> cache = CacheBuilder.newBuilder() .maximumSize(100) .expireAfterAccess(10, TimeUnit.SECONDS) .removalListener(new RemovalListener<String, String>() { @Override public void onRemoval(RemovalNotification<String, String> removalNotification) { System.out.println("過時刪除的勾點觸發了... key ===> " + removalNotification.getKey()); } }) .recordStats() .build(new CacheLoader<String, String>() { // 處理快取鍵不存在快取值時的處理邏輯 @Override public String load(String key) throws Exception { return "不存在的key"; } }); cache.put("name", "小明"); cache.put("pwd", "112345"); // 模擬執行緒等待... try { Thread.sleep(15000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("token ===> " + cache.get("name")); System.out.println("name ===> " + cache.get("pwd")); } }
執行結果
過時刪除的勾點觸發了... key ===> name
token ===> 不存在的key
過時刪除的勾點觸發了... key ===> pwd
name ===> 不存在的key
guava做cache時候資料的移除分為被動移除和主動移除兩種。
被動移除
主動移除
如果設定了移除監聽器RemovalListener,則在所有移除的動作時會同步執行該listener下的邏輯。
如需改成非同步,使用:RemovalListeners.asynchronous(RemovalListener, Executor).
CacheBuilder構建的快取不會在特定時間自動執行清理和回收工作,也不會在某個快取項過期後馬上清理,它不會啟動一個執行緒來進行快取維護,因為首先執行緒相對較重,其次某些環境限制執行緒的建立。
它會在寫操作時順帶做少量的維護工作,或者偶爾在讀操作時做。當然,也可以建立自己的維護執行緒,以固定的時間間隔呼叫Cache.cleanUp()。
我們可以參考上面兩個工具包的思路,自己封裝一個可以設定過時時間的HashMap來實現我們想要的效果。
到此這篇關於Java如何設定過期時間的map的幾種方法的文章就介紹到這了,更多相關Java 過期時間map內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45