Javaで有効期限マップを設定する方法
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 ===> 管理者
マップを作成する場合、有効期限や有効期限ポリシーなどの指定されたパラメータはグローバルであり、マップに追加されるすべてのエントリに適用されます。
エントリのキーと値のペアを設定する場合、現在のエントリに対して有効期限と有効期限ポリシーを個別に設定できますが、これは現在のエントリに対してのみ有効です。
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 ===> name4.3 削除メカニズムguava がデータをキャッシュする場合、受動的削除と能動的削除の 2 種類のデータ削除があります。 パッシブ削除token ===> 存在しないキー
廃止された削除フックがトリガーされました... key ===> pwd
name ===> 存在しないキー
- サイズベースの削除: 数値が指定されたサイズに達すると、使用頻度の低いキー値が削除されます
- 時間ベースの削除:expirateAfterAccess(long, TimeUnit) 最後のアクセスからの経過時間に基づいてキーと値のペアを削除します。 expireAfterWrite(long, TimeUnit) キーと値のペアが作成された後、または値が置き換えられた後の時間に基づいて削除します
- 参照ベースの削除: 主に Java のガベージ コレクション メカニズムに基づいています。キーまたは値の参照関係に基づく削除
- 個別に削除: Cache.invalidate(key)
- バッチ削除: Cache.invalidateAll(keys)
- すべて削除: Cache.invalidateAll()
- put 操作の前に、このキー値を使用すると、removeListener が最初にトリガーされてリスナーが削除され、次に
- がexpireAfterAccessとexpireAfterWriteで構成されますが、指定された時間が経過しても削除されません。
- 削除ポリシー ロジック:
以上がJavaで有効期限マップを設定する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undress AI Tool
脱衣画像を無料で

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

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

Clothoff.io
AI衣類リムーバー

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

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

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

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

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

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

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

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

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

プロバイダーメカニズムを介してアルゴリズムを実装する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を使用し、時間内に明確な敏感なモードを使用します

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

パターンクラスは正規表現をコンパイルするために使用され、マッチャークラスは文字列のマッチング操作を実行するために使用されます。 2つの組み合わせは、テキスト検索、マッチング、交換を実現できます。まず、pattern.compile()を介してパターンオブジェクトを作成し、次にそのmatcher()メソッドを呼び出して、matcherインスタンスを生成します。次に、matches()を使用して、完全な文字列マッチングを判断し、()を見つけて、shinkesceence、find()を見つけます。レギュラーにキャプチャグループが含まれている場合、n番目のグループコンテンツはグループ(n)を介して取得できます。実際のアプリケーションでは、繰り返しの編集パターンを避け、特別なキャラクターのエスケープに注意を払い、必要に応じて一致するパターンフラグを使用し、最終的に効率的に達成する必要があります
![閉じた後に保存しない笑ゲーム設定[修正]](https://img.php.cn/upload/article/001/431/639/175597664176545.jpg?x-oss-process=image/resize,m_fill,h_207,w_330)
IfLeagueofLegendssettingsaren’tsaving,trythesesteps:1.Runthegameasadministrator.2.GrantfullfolderpermissionstotheLeagueofLegendsdirectory.3.Editandensuregame.cfgisn’tread-only.4.Disablecloudsyncforthegamefolder.5.RepairthegameviatheRiotClient.
