目次
1. 技術的背景
2. 技術的効果
3. ExpiringMap
3.1 関数の概要
3.2 ソース コード
3.3 例
ホームページ Java &#&チュートリアル Javaで有効期限マップを設定する方法

Javaで有効期限マップを設定する方法

May 04, 2023 am 10:13 AM
java map

1. 技術的背景

実際のプロジェクト開発では、システムの可用性と堅牢性の向上に役立つキャッシュ ミドルウェア (redis、MemCache など) をよく使用します。

しかし、多くの場合、プロジェクトが比較的単純であれば、システムの複雑さを増すためにキャッシュを使用するために Redis などのミドルウェアを特別に導入する必要はありません。それでは、Java 自体には便利な軽量キャッシュ コンポーネントがあるのでしょうか?

答えはもちろん「はい」であり、方法は複数あります。一般的なソリューションには、ExpiringMap、LoadingCache、および HashMap ベースのパッケージ化が含まれます。

2. 技術的効果

  • 古い削除戦略などのキャッシュの一般的な機能を実現します

  • ホット データのウォームアップ

3. ExpiringMap

3.1 関数の概要

  • マップ内のエントリは、一定期間後に自動的に期限切れになるように設定できます。時間。

  • マップの最大容量値を設定できます。最大サイズに達すると、値を再度挿入すると、マップ内の最初の値が期限切れになります。

  • リスニング イベントを追加し、エントリの有効期限が切れたときにリスニング機能をスケジュールできます。

  • 遅延読み込みを設定し、get() メソッドが呼び出されたときにオブジェクトを作成できます。

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: 设置最大值,添加第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 ===> 管理者

注意

マップを作成する場合、有効期限や有効期限ポリシーなどの指定されたパラメータはグローバルであり、マップに追加されるすべてのエントリに適用されます。
エントリのキーと値のペアを設定する場合、現在のエントリに対して有効期限と有効期限ポリシーを個別に設定できますが、これは現在のエントリに対してのみ有効です。

4. LoadingCache

4.1 機能の紹介

Google がオープンソース化したスレッドセーフなローカル キャッシュ ソリューション。

特徴: キャッシュのリサイクル メカニズム、キャッシュの読み込み/ヒット ステータスの監視、柔軟で強力な機能、シンプルで使いやすい API を提供します。

4.2 例

ソース コード

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 ===> pwd
name ===> 存在しないキー

4.3 削除メカニズム

guava がデータをキャッシュする場合、受動的削除と能動的削除の 2 種類のデータ削除があります。

パッシブ削除

  • サイズベースの削除: 数値が指定されたサイズに達すると、使用頻度の低いキー値が削除されます

  • 時間ベースの削除:expirateAfterAccess(long, TimeUnit) 最後のアクセスからの経過時間に基づいてキーと値のペアを削除します。 expireAfterWrite(long, TimeUnit) キーと値のペアが作成された後、または値が置き換えられた後の時間に基づいて削除します

  • 参照ベースの削除: 主に Java のガベージ コレクション メカニズムに基づいています。キーまたは値の参照関係に基づく削除

アクティブな削除

  • 個別に削除: Cache.invalidate(key)

  • バッチ削除: Cache.invalidateAll(keys)

  • すべて削除: Cache.invalidateAll()

If削除リスナー RemovalListener が設定されている場合、リスナーの下のロジックはすべての削除アクション中に同期して実行されます。

非同期に変更する必要がある場合は、RemovalListeners.asynchronous(RemovalListener, Executor) を使用します。

4.4 その他

  • put 操作の前に、このキー値を使用すると、removeListener が最初にトリガーされてリスナーが削除され、次に

  • がexpireAfterAccessとexpireAfterWriteで構成されますが、指定された時間が経過しても削除されません。

  • 削除ポリシー ロジック:

CacheBuilder によって構築されたキャッシュは、特定の時間に自動的にクリーニングとリサイクル作業を実行しません。特定の時間に実行されます。キャッシュ項目は有効期限が切れるとすぐにクリーンアップされます。第一にスレッドが比較的重いこと、第二に環境によってはスレッドの作成が制限されているため、キャッシュ メンテナンスのためのスレッドは開始されません。

書き込み操作中、または場合によっては読み取り操作中に、少量のメンテナンス作業を実行します。もちろん、独自のメンテナンス スレッドを作成し、一定の間隔で Cache.cleanUp() を呼び出すこともできます。

以上がJavaで有効期限マップを設定する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Javaのデッドロックとは何ですか?どうすればそれを防ぐことができますか? Javaのデッドロックとは何ですか?どうすればそれを防ぐことができますか? Aug 23, 2025 pm 12:55 PM

adeadlockinjavaoccurswhentwoorthoreThreadsareblockededforever、それぞれの方向に、通常はdueTococularwaitcausedistentlockdoringを使用します

Javaでオプションの使用方法は? Javaでオプションの使用方法は? Aug 22, 2025 am 10:27 AM

useoptional.empty()、optional.of()、andoptional.ofnullable()tocleateoptionalinstancesは、null、ornull、orpossivally null.2.ceeckforvaluessafelyusingispresent()orpreferablesifppresent()directnullted()aboiddirectnullted()aboiddirestinect()ofoiddirestinect()ofoiddirefrestnullterisent()

Micronautを使用したクラウドネイティブJavaアプリケーションの構築 Micronautを使用したクラウドネイティブJavaアプリケーションの構築 Aug 20, 2025 am 01:53 AM

micronautisidealforbuildingcloud-nativejavaapplicationsduetoitsoitsoitlowmemoryfootprint、faststartuptimes、およびcompile-rededependencyinjection、makingsuperiortotrocksworkslikespringbootformicroservices、contate、anderverlessenvironments.1.micronments

Spring Data JPAおよびHibernateを使用したJavaの持続性 Spring Data JPAおよびHibernateを使用したJavaの持続性 Aug 22, 2025 am 07:52 AM

SpringdatajpaとHibernateの核心は一緒に働いています。1。JPAは仕様であり、Hibernateは実装であり、Springdatajpaのカプセル化はDAO開発を簡素化します。 2。エンティティクラス@Entity、@ID、@Columnなどを介してデータベース構造をマップします。 3。リポジトリインターフェイスはJParePositoryを継承して、CRUDおよび名前付きクエリメソッドを自動的に実装します。 4.複雑なクエリは、@queryアノテーションを使用してJPQLまたはネイティブSQLをサポートします。 5。スプリングブートでは、スターター依存関係を追加し、データソースとJPA属性の構成により統合が完了します。 6。トランザクションは@Transactionaによって行われます

安全なコーディングのためのJava暗号化アーキテクチャ(JCA) 安全なコーディングのためのJava暗号化アーキテクチャ(JCA) Aug 23, 2025 pm 01:20 PM

プロバイダーメカニズムを介してアルゴリズムを実装するMessaged Gigest、Cipher、Keygenerator、Securerandom、Signature、KeystoreなどのJCAコアコンポーネントを理解します。 2. SHA-256/SHA-512、AES(256ビットキー、GCMモード)、RSA(2048ビット以上)、Securerandomなどの強力なアルゴリズムとパラメーターを使用します。 3.ハードコーディングされたキーを避け、キーストアを使用してキーを管理し、PBKDF2などの安全に派生したパスワードを介してキーを生成します。 4. ECBモードを無効にし、GCMなどの認証暗号化モードを採用し、各暗号化に一意のランダムIVを使用し、時間内に明確な敏感なモードを使用します

修正:Windowsは「必要な特権はクライアントによって保持されていません」を示しています。 修正:Windowsは「必要な特権はクライアントによって保持されていません」を示しています。 Aug 20, 2025 pm 12:02 PM

runtheapplicationorcommandministrator byright-clicking and "runasadministrator" toensureelevatedprivilegeSareSaregranted.2.CheckuseraccountControl(UAC)Settingsearching foruacing foruacing inthestartmenuandSettingtheSedEdeDededefaultLevel(second)

Javaでパターンクラスとマッチャークラスを使用する方法は? Javaでパターンクラスとマッチャークラスを使用する方法は? Aug 22, 2025 am 09:57 AM

パターンクラスは正規表現をコンパイルするために使用され、マッチャークラスは文字列のマッチング操作を実行するために使用されます。 2つの組み合わせは、テキスト検索、マッチング、交換を実現できます。まず、pattern.compile()を介してパターンオブジェクトを作成し、次にそのmatcher()メソッドを呼び出して、matcherインスタンスを生成します。次に、matches()を使用して、完全な文字列マッチングを判断し、()を見つけて、shinkesceence、find()を見つけます。レギュラーにキャプチャグループが含まれている場合、n番目のグループコンテンツはグループ(n)を介して取得できます。実際のアプリケーションでは、繰り返しの編集パターンを避け、特別なキャラクターのエスケープに注意を払い、必要に応じて一致するパターンフラグを使用し、最終的に効率的に達成する必要があります

閉じた後に保存しない笑ゲーム設定[修正] 閉じた後に保存しない笑ゲーム設定[修正] Aug 24, 2025 am 03:17 AM

IfLeagueofLegendssettingsaren’tsaving,trythesesteps:1.Runthegameasadministrator.2.GrantfullfolderpermissionstotheLeagueofLegendsdirectory.3.Editandensuregame.cfgisn’tread-only.4.Disablecloudsyncforthegamefolder.5.RepairthegameviatheRiotClient.

See all articles