亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

目錄
一、技術(shù)背景
二、技術(shù)效果
三、ExpiringMap
4.1 功能簡介
3.2 原始碼
4.2 範(fàn)例
四、LoadingCache
4.3 移除機(jī)制
4.4 其他
首頁 Java java教程 Java怎麼設(shè)定過期時(shí)間的map

Java怎麼設(shè)定過期時(shí)間的map

May 04, 2023 am 10:13 AM
java map

一、技術(shù)背景

在實(shí)際的專案開發(fā)中,我們經(jīng)常會(huì)使用到快取中間件(如redis、MemCache等)來幫助我們提高系統(tǒng)的可用性和健全性。

但是很多時(shí)候如果專案比較簡單,就沒有必要為了使用快取而專門引入Redis等等中間件來加重系統(tǒng)的複雜性。那麼Java本身有沒有好用的輕量級(jí)的快取元件呢。

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

二、技術(shù)效果

  • 實(shí)作快取的常見功能,如過時(shí)刪除策略

  • 熱點(diǎn)資料預(yù)熱

三、ExpiringMap

3.1 功能簡介

  • 可設(shè)定Map中的Entry在一段時(shí)間後自動(dòng)過期。

  • 可設(shè)定Map最大容納值,當(dāng)?shù)竭_(dá)Maximum size後,再次插入值會(huì)導(dǎo)致Map中的第一個(gè)值過期。

  • 可新增監(jiān)聽事件,在監(jiān)聽到Entry過期時(shí)調(diào)度監(jiān)聽函數(shù)。

  • 可以設(shè)定懶加載,在呼叫g(shù)et()方法時(shí)建立物件。

3.2 原始碼

github位址

3.3 範(fàn)例

新增依賴(Maven)

<dependency> 
    <groupId>net.jodah</groupId> 
    <artifactId>expiringmap</artifactId> 
    <version>0.5.8</version> 
</dependency>

範(fàn)例原始碼

public class ExpiringMapApp {

    public static void main(String[] args) {
        // maxSize: 設(shè)置最大值,添加第11個(gè)entry時(shí),會(huì)導(dǎo)致第1個(gè)立馬過期(即使沒到過期時(shí)間)
        // expiration:設(shè)置每個(gè)key有效時(shí)間10s, 如果key不設(shè)置過期時(shí)間,key永久有效。
        // variableExpiration: 允許更新過期時(shí)間值,如果不設(shè)置variableExpiration,不允許后面更改過期時(shí)間,一旦執(zhí)行更改過期時(shí)間操作會(huì)拋異常UnsupportedOperationException
        // policy:
        //        CREATED: 只在put和replace方法清零過期時(shí)間
        //        ACCESSED: 在CREATED策略基礎(chǔ)上增加, 在還沒過期時(shí)get方法清零過期時(shí)間。
        //        清零過期時(shí)間也就是重置過期時(shí)間,重新計(jì)算過期時(shí)間.
        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í),指定的那些參數(shù)如過期時(shí)間和過期策略都是全局的, 對map中添加的每一個(gè)entry都適用.
        //        在put一個(gè)entry鍵值對時(shí)可以對當(dāng)前entry 單獨(dú)設(shè)置 過期時(shí)間、過期策略,只對當(dāng)前這個(gè)entry有效.
    }
}

運(yùn)行結(jié)果

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

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

四、LoadingCache

4.1 功能簡介

Google開源出來的一個(gè)線程安全的本地快取解決方案。

特點(diǎn):提供快取回收機(jī)制,監(jiān)控快取載入/命中情況,靈活強(qiáng)大的功能,簡單易上手的api。

4.2 範(fàn)例

原始碼

public class LoadingCacheApp {

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

運(yùn)行結(jié)果

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

4.3 移除機(jī)制

guava做cache時(shí)候資料的移除分為被動(dòng)移除和主動(dòng)移除兩種。

被動(dòng)移除

  • 基於大小的移除:數(shù)量達(dá)到指定大小,會(huì)把不常用的鍵值移除

  • 基於時(shí)間的移除:expireAfterAccess(long, TimeUnit) 根據(jù)某個(gè)鍵值對最後一次訪問之後多少時(shí)間後移除。 expireAfterWrite(long, TimeUnit) 根據(jù)某個(gè)鍵值對被創(chuàng)建或值被替換後多少時(shí)間移除

  • 基於引用的移除:主要是基於java的垃圾回收機(jī)制,根據(jù)鍵或值的參考關(guān)係決定移除

主動(dòng)移除

  • #單獨(dú)移除:Cache.invalidate(key)

  • 批次移除:Cache.invalidateAll(keys)

  • #移除所有:Cache.invalidateAll()

#如果設(shè)定了移除監(jiān)聽器RemovalListener,則在所有移除的動(dòng)作時(shí)會(huì)同步執(zhí)行該listener下的邏輯。

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

4.4 其他

  • #在put操作之前,如果已經(jīng)有該鍵值,會(huì)先觸發(fā)removalListener移除監(jiān)聽器,再加入

  • #設(shè)定了expireAfterAccess和expireAfterWrite,但在指定時(shí)間後沒有移除。

  • 刪除策略邏輯:

CacheBuilder建置的快取不會(huì)在特定時(shí)間自動(dòng)執(zhí)行清理和回收工作,也不會(huì)在某個(gè)快取項(xiàng)目過期後馬上清理,它不會(huì)啟動(dòng)一個(gè)執(zhí)行緒來進(jìn)行快取維護(hù),因?yàn)槭紫葓?zhí)行緒相對較重,其次是某些環(huán)境限制執(zhí)行緒的建立。

它會(huì)在寫入操作時(shí)順帶做少量的維護(hù)工作,或偶爾在讀取操作時(shí)做。當(dāng)然,也可以建立自己的維護(hù)線程,以固定的時(shí)間間隔呼叫Cache.cleanUp()。

以上是Java怎麼設(shè)定過期時(shí)間的map的詳細(xì)內(nèi)容。更多資訊請關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

本網(wǎng)站聲明
本文內(nèi)容由網(wǎng)友自願(yuàn)投稿,版權(quán)歸原作者所有。本站不承擔(dān)相應(yīng)的法律責(zé)任。如發(fā)現(xiàn)涉嫌抄襲或侵權(quán)的內(nèi)容,請聯(lián)絡(luò)admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費(fèi)脫衣圖片

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅(qū)動(dòng)的應(yīng)用程序,用於創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費(fèi)的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費(fèi)的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強(qiáng)大的PHP整合開發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺化網(wǎng)頁開發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級(jí)程式碼編輯軟體(SublimeText3)

熱門話題

Laravel 教程
1597
29
PHP教程
1488
72
VSCODE設(shè)置。 JSON位置 VSCODE設(shè)置。 JSON位置 Aug 01, 2025 am 06:12 AM

settings.json文件位於用戶級(jí)或工作區(qū)級(jí)路徑,用於自定義VSCode設(shè)置。 1.用戶級(jí)路徑:Windows為C:\Users\\AppData\Roaming\Code\User\settings.json,macOS為/Users//Library/ApplicationSupport/Code/User/settings.json,Linux為/home//.config/Code/User/settings.json;2.工作區(qū)級(jí)路徑:項(xiàng)目根目錄下的.vscode/settings

如何使用JDBC處理Java的交易? 如何使用JDBC處理Java的交易? Aug 02, 2025 pm 12:29 PM

要正確處理JDBC事務(wù),必須先關(guān)閉自動(dòng)提交模式,再執(zhí)行多個(gè)操作,最後根據(jù)結(jié)果提交或回滾;1.調(diào)用conn.setAutoCommit(false)以開始事務(wù);2.執(zhí)行多個(gè)SQL操作,如INSERT和UPDATE;3.若所有操作成功則調(diào)用conn.commit(),若發(fā)生異常則調(diào)用conn.rollback()確保數(shù)據(jù)一致性;同時(shí)應(yīng)使用try-with-resources管理資源,妥善處理異常並關(guān)閉連接,避免連接洩漏;此外建議使用連接池、設(shè)置保存點(diǎn)實(shí)現(xiàn)部分回滾,並保持事務(wù)盡可能短以提升性能。

在Java的掌握依賴注入春季和Guice 在Java的掌握依賴注入春季和Guice Aug 01, 2025 am 05:53 AM

依賴性(di)IsadesignpatternwhereObjectsReceivedenciesenciesExtern上,推廣looseSecouplingAndEaseerTestingThroughConstructor,setter,orfieldInjection.2.springfraMefringframeWorkSannotationsLikeLikeLike@component@component,@component,@service,@autowiredwithjava-service和@autowiredwithjava-ligatiredwithjava-lase-lightike

了解Java虛擬機(jī)(JVM)內(nèi)部 了解Java虛擬機(jī)(JVM)內(nèi)部 Aug 01, 2025 am 06:31 AM

TheJVMenablesJava’s"writeonce,runanywhere"capabilitybyexecutingbytecodethroughfourmaincomponents:1.TheClassLoaderSubsystemloads,links,andinitializes.classfilesusingbootstrap,extension,andapplicationclassloaders,ensuringsecureandlazyclassloa

如何使用Java的日曆? 如何使用Java的日曆? Aug 02, 2025 am 02:38 AM

使用java.time包中的類替代舊的Date和Calendar類;2.通過LocalDate、LocalDateTime和LocalTime獲取當(dāng)前日期時(shí)間;3.使用of()方法創(chuàng)建特定日期時(shí)間;4.利用plus/minus方法不可變地增減時(shí)間;5.使用ZonedDateTime和ZoneId處理時(shí)區(qū);6.通過DateTimeFormatter格式化和解析日期字符串;7.必要時(shí)通過Instant與舊日期類型兼容;現(xiàn)代Java中日期處理應(yīng)優(yōu)先使用java.timeAPI,它提供了清晰、不可變且線

Google Chrome無法打開本地文件 Google Chrome無法打開本地文件 Aug 01, 2025 am 05:24 AM

ChromecanopenlocalfileslikeHTMLandPDFsbyusing"Openfile"ordraggingthemintothebrowser;ensuretheaddressstartswithfile:///;2.SecurityrestrictionsblockAJAX,localStorage,andcross-folderaccessonfile://;usealocalserverlikepython-mhttp.server8000tor

了解網(wǎng)絡(luò)端口和防火牆 了解網(wǎng)絡(luò)端口和防火牆 Aug 01, 2025 am 06:40 AM

NetworkPortSandFireWallsworkTogetHertoEnableCommunication whereSeringSecurity.1.NetWorkPortSareVirtualendPointSnumbered0-655 35,with-Well-with-Newonportslike80(HTTP),443(https),22(SSH)和25(smtp)sindiessingspefificservices.2.portsoperateervertcp(可靠,c

比較Java框架:Spring Boot vs Quarkus vs Micronaut 比較Java框架:Spring Boot vs Quarkus vs Micronaut Aug 04, 2025 pm 12:48 PM

前形式攝取,quarkusandmicronautleaddueTocile timeProcessingandGraalvSupport,withquarkusoftenpernperforminglightbetterine nosserless notelless centarios.2。

See all articles