最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java如何設(shè)置過期時間的map的幾種方法

 更新時間:2022年03月16日 11:48:12   作者:瘦子沒有夏天  
本文主要介紹了Java如何設(shè)置過期時間的map的幾種方法,常見的解決方法有:ExpiringMap、LoadingCache及基于HashMap的封裝三種,下面就詳細(xì)的介紹一下,感興趣的可以了解下

一、技術(shù)背景

在實際的項目開發(fā)中,我們經(jīng)常會使用到緩存中間件(如redis、MemCache等)來幫助我們提高系統(tǒng)的可用性和健壯性。

但是很多時候如果項目比較簡單,就沒有必要為了使用緩存而專門引入Redis等等中間件來加重系統(tǒng)的復(fù)雜性。那么Java本身有沒有好用的輕量級的緩存組件呢。

答案當(dāng)然是有嘍,而且方法不止一種。常見的解決方法有:ExpiringMap、LoadingCache及基于HashMap的封裝三種。

二、技術(shù)效果

  • 實現(xiàn)緩存的常見功能,如過時刪除策略
  • 熱點數(shù)據(jù)預(yù)熱

三、ExpiringMap

3.1 功能簡介

  • 可設(shè)置Map中的Entry在一段時間后自動過期。
  • 可設(shè)置Map最大容納值,當(dāng)?shù)竭_(dá)Maximum size后,再次插入值會導(dǎo)致Map中的第一個值過期。
  • 可添加監(jiān)聽事件,在監(jiān)聽到Entry過期時調(diào)度監(jiān)聽函數(shù)。
  • 可以設(shè)置懶加載,在調(diào)用get()方法時創(chuàng)建對象。

3.2 源碼

github地址

3.3 示例

添加依賴(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: 設(shè)置最大值,添加第11個entry時,會導(dǎo)致第1個立馬過期(即使沒到過期時間)
?? ??? ?// expiration:設(shè)置每個key有效時間10s, 如果key不設(shè)置過期時間,key永久有效。
?? ??? ?// variableExpiration: 允許更新過期時間值,如果不設(shè)置variableExpiration,不允許后面更改過期時間,一旦執(zhí)行更改過期時間操作會拋異常UnsupportedOperationException
?? ??? ?// policy:
?? ??? ?// ? ? ? ?CREATED: 只在put和replace方法清零過期時間
?? ??? ?// ? ? ? ?ACCESSED: 在CREATED策略基礎(chǔ)上增加, 在還沒過期時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"));

?? ??? ?// 注意: 在創(chuàng)建map時,指定的那些參數(shù)如過期時間和過期策略都是全局的, 對map中添加的每一個entry都適用.
?? ??? ?// ? ? ? ?在put一個entry鍵值對時可以對當(dāng)前entry 單獨設(shè)置 過期時間、過期策略,只對當(dāng)前這個entry有效.
?? ?}
}

運行結(jié)果

token ===> null
name ===> 管理員

注意
在創(chuàng)建map時,指定的那些參數(shù)如過期時間和過期策略都是全局的, 對map中添加的每一個entry都適用。
在put一個entry鍵值對時可以對當(dāng)前entry 單獨設(shè)置 過期時間、過期策略,只對當(dāng)前這個entry有效.

四、LoadingCache

4.1 功能簡介

Google開源出來的一個線程安全的本地緩存解決方案。

特點:提供緩存回收機制,監(jiān)控緩存加載/命中情況,靈活強大的功能,簡單易上手的api。

4.2 示例

源碼

public class LoadingCacheApp {

?? ?public static void main(String[] args) throws Exception {
?? ??? ?// maximumSize: 緩存池大小,在緩存項接近該大小時, Guava開始回收舊的緩存項
?? ??? ?// expireAfterAccess: 設(shè)置時間對象沒有被讀/寫訪問則對象從內(nèi)存中刪除(在另外的線程里面不定期維護)
?? ??? ?// removalListener: 移除監(jiān)聽器,緩存項被移除時會觸發(fā)的鉤子
?? ??? ?// recordStats: 開啟Guava Cache的統(tǒng)計功能
?? ??? ?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("過時刪除的鉤子觸發(fā)了... 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"));
?? ?}
}

運行結(jié)果

過時刪除的鉤子觸發(fā)了... key ===> name
token ===> 不存在的key
過時刪除的鉤子觸發(fā)了... key ===> pwd
name ===> 不存在的key

4.3 移除機制

guava做cache時候數(shù)據(jù)的移除分為被動移除和主動移除兩種。

被動移除

  • 基于大小的移除:數(shù)量達(dá)到指定大小,會把不常用的鍵值移除
  • 基于時間的移除:expireAfterAccess(long, TimeUnit) 根據(jù)某個鍵值對最后一次訪問之后多少時間后移除。expireAfterWrite(long, TimeUnit) 根據(jù)某個鍵值對被創(chuàng)建或值被替換后多少時間移除
  • 基于引用的移除:主要是基于java的垃圾回收機制,根據(jù)鍵或者值的引用關(guān)系決定移除

主動移除

  • 單獨移除:Cache.invalidate(key)
  • 批量移除:Cache.invalidateAll(keys)
  • 移除所有:Cache.invalidateAll()

如果配置了移除監(jiān)聽器RemovalListener,則在所有移除的動作時會同步執(zhí)行該listener下的邏輯。

如需改成異步,使用:RemovalListeners.asynchronous(RemovalListener, Executor).

4.4 其他

  • 在put操作之前,如果已經(jīng)有該鍵值,會先觸發(fā)removalListener移除監(jiān)聽器,再添加
  • 配置了expireAfterAccess和expireAfterWrite,但在指定時間后沒有被移除。
  • 刪除策略邏輯:

CacheBuilder構(gòu)建的緩存不會在特定時間自動執(zhí)行清理和回收工作,也不會在某個緩存項過期后馬上清理,它不會啟動一個線程來進行緩存維護,因為首先線程相對較重,其次某些環(huán)境限制線程的創(chuàng)建。

它會在寫操作時順帶做少量的維護工作,或者偶爾在讀操作時做。當(dāng)然,也可以創(chuàng)建自己的維護線程,以固定的時間間隔調(diào)用Cache.cleanUp()。

五、HashMap的封裝

我們可以參考上面兩個工具包的思路,自己封裝一個可以設(shè)置過時時間的HashMap來實現(xiàn)我們想要的效果。

到此這篇關(guān)于Java如何設(shè)置過期時間的map的幾種方法的文章就介紹到這了,更多相關(guān)Java 過期時間map內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java與C++實現(xiàn)相同的MD5加密算法簡單實例

    Java與C++實現(xiàn)相同的MD5加密算法簡單實例

    下面小編就為大家?guī)硪黄狫ava與C++實現(xiàn)相同的MD5加密算法簡單實例。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-09-09
  • Java Spring MVC 上傳下載文件配置及controller方法詳解

    Java Spring MVC 上傳下載文件配置及controller方法詳解

    這篇文章主要介紹了Java Spring MVC 上傳下載文件配置及controller方法詳解,本文介紹的非常詳細(xì),具有參考借鑒價值,需要的朋友可以參考下
    2016-09-09
  • Mybatis通過攔截器實現(xiàn)單數(shù)據(jù)源內(nèi)多數(shù)據(jù)庫切換

    Mybatis通過攔截器實現(xiàn)單數(shù)據(jù)源內(nèi)多數(shù)據(jù)庫切換

    這篇文章主要為大家詳細(xì)介紹了Mybatis如何通過攔截器實現(xiàn)單數(shù)據(jù)源內(nèi)多數(shù)據(jù)庫切換,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-12-12
  • 深入理解JavaWeb中過濾器與監(jiān)聽器的應(yīng)用

    深入理解JavaWeb中過濾器與監(jiān)聽器的應(yīng)用

    這篇文章主要介紹了JavaWeb中過濾器與監(jiān)聽器的應(yīng)用,過濾器能夠?qū)ζヅ涞恼埱蟮竭_(dá)目標(biāo)之前或返回響應(yīng)之后增加一些處理代碼,監(jiān)聽器是一個接口內(nèi)容由我們實現(xiàn),會在特定時間被調(diào)用,感興趣想要詳細(xì)了解可以參考下文
    2023-05-05
  • Java?synchronized底層實現(xiàn)原理以及鎖優(yōu)化

    Java?synchronized底層實現(xiàn)原理以及鎖優(yōu)化

    Synchronized是Java中解決并發(fā)問題的一種最常用的方法,也是最簡單的一種方法,下面這篇文章主要給大家介紹了關(guān)于Java?synchronized底層實現(xiàn)原理以及鎖優(yōu)化的相關(guān)資料,需要的朋友可以參考下
    2022-02-02
  • 基于Java制作一個簡易的遠(yuǎn)控終端

    基于Java制作一個簡易的遠(yuǎn)控終端

    這篇文章主要為大家詳細(xì)介紹了如何基于Java制作一個簡易的遠(yuǎn)控終端,文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價值,感興趣的可以了解一下
    2023-04-04
  • Java編程實現(xiàn)非對稱加密的方法詳解

    Java編程實現(xiàn)非對稱加密的方法詳解

    這篇文章主要介紹了Java編程實現(xiàn)非對稱加密的方法,簡單講述了非對稱加密的概念、原理,并結(jié)合實例形式分析了java實現(xiàn)DH加密解密、RSA加密解密、ElGamal加密等具體操作技巧,需要的朋友可以參考下
    2017-08-08
  • java多線程應(yīng)用實現(xiàn)方法

    java多線程應(yīng)用實現(xiàn)方法

    以前沒有寫筆記的習(xí)慣,現(xiàn)在慢慢的發(fā)現(xiàn)及時總結(jié)是多么的重要了,呵呵。雖然才大二,但是也快要畢業(yè)了,要加油
    2012-11-11
  • 深入理解Java中的SPI機制

    深入理解Java中的SPI機制

    這篇文章主要介紹了深入理解Java中的SPI機制,幫助大家更好的理解和學(xué)習(xí)使用Java,感興趣的朋友可以了解下
    2021-02-02
  • java重試機制使用RPC必須考慮冪等性原理解析

    java重試機制使用RPC必須考慮冪等性原理解析

    這篇文章主要為大家介紹了java重試機制使用RPC必須考慮冪等性原理解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-03-03

最新評論

蓝山县| 郧西县| 临沭县| 德昌县| 金山区| 奉新县| 酒泉市| 济南市| 固阳县| 若尔盖县| 天全县| 合阳县| 大田县| 台南县| 都江堰市| 建昌县| 岳西县| 九寨沟县| 平塘县| 顺义区| 化德县| 双鸭山市| 玉环县| 隆尧县| 山阳县| 定兴县| 阿克| 保康县| 清丰县| 天台县| 乌恰县| 达尔| 鹿泉市| 南木林县| 许昌市| 满城县| 平原县| 北碚区| 翼城县| 临沂市| 临泉县|