高性能ローカルキャッシュ
ローカルキャッシュをキャッシュする前に、ローカルキャッシュの何が良いのか、それは単なるマップではないかを考える必要があります。キャッシュするデータを地図に保存すれば、自分で行うことができます。ただし、考慮すべき点がいくつかあります。
「「」
並行性-法線マップまたはスレッドセーフなConcurrentMapを使用しますか?
容量-マップの容量はどのくらいですか?
有効期限ポリシー-マップ内のデータは、長期間使用されない場合、定期的にクリアする必要がありますか?
エビクションポリシー-データの有効期限が切れていないのに容量がいっぱいになった場合はどうすればよいですか?
これらの問題も発生する場合は、次の記事を参照してください。
以前、GoogleのローカルキャッシュGuava Cacheを紹介しました。興味がある場合は、次の記事を読むことができます。
「「 」
しかし、このローカルキャッシュは使い勝手が悪く、パフォーマンスも高くないと思います。したがって、高性能のローカルキャッシュフレームワークであるCaffeineをお勧めします。これは、Guava Cacheのアップグレードバージョンであり、非常に使いやすくなっています。その使用例を見てみましょう。
パフォーマンス
パフォーマンス表示:
読み取り(100%)
書き込み(100%)
上の写真から、次のことがわかります。読み取りでも書き込みでも、カフェインのパフォーマンスはどれほど強いか。
使用例
最初にMaven依存関係をインポートします。
<dependency>
<groupId>com.github.ben-manes.caffeine</groupId>
<artifactId>caffeine</artifactId>
<version>2.8.4</version>
</dependency>
テストコード:
最初にキャッシュを作成しましょうcache
。ここでは、いくつかのプロパティを定義します。
「「
maximumSize():
ここでは、キャッシュ数の上限を設定できます。
expireAfterWriter():
最後の書き込み後の有効期限を示します。
weakKeys():
キーは弱参照を使用します。
weakValues():
値の値は、メモリリークを防ぐために弱参照を使用します。」
removeListener():
キャッシュの有効期限が切れるタイミングを監視します。
弱参照とメモリリークに関して、興味のある人は私が書いたこの記事をチェックすることができます:
「「 」
「「 」
Caffeineは、スレッドセーフで同時に高性能なConcurrentMapを使用します
キャッシュから取得を開始します。
String valueFromCache = cache.get("lvshen", key -> getValue(key));
コードとして、cache
getキーからlvshen
値まで、cache
取得がメソッドgetValue(key)
getinからの取得よりも少ない場合。一般的に、キャッシュをチェックするには3つのステップがあります。
「「」
キャッシュからクエリを実行します。キャッシュに値がある場合は、
キャッシュに値がない場合は、データベースから取得して、
値をデータベースのキャッシュに保存します
Caffeineのローカルキャッシュも同じロジックです。このロジックをシミュレートするために、キャッシュからキーlvhsen
の値を2回取得します。最初にデータベースから取得されるときにgetValue()
メソッドが呼び出され、2回目にはキャッシュから直接取得されます。
結果は次のとおりです。
调用了getValue方法....
测试结果:lvshen
测试结果2:lvshen
動作結果により、上記の論理が確認されました。
キャッシュを自動的にクリアすることに加えて、手動でキャッシュをクリアすることもできます。
cache.invalidate("lvshen");
Guava CacheとCaffeineの大きな違いは、使用される除去アルゴリズム、Guava Cacheで使用されるLRUアルゴリズム、およびCaffeineで使用されるLFUアルゴリズムのアップグレードされたTinyLFUアルゴリズムにあります。LRUアルゴリズムとLFUアルゴリズムの違いについては、次のように読むことができます。この記事私は記事を書きました:
「「 」
LFUアルゴリズムのアップグレードバージョンであるTinyLFUは、パフォーマンスがより強力です(ヒット率が高く、メモリ使用量が少ない)。具体的な実装については、ここでは詳しく説明しません。
もちろん、SpringBootを使用することもできます。
最初に構成を構成します
使用時の直接噴射:
@Autowired
Cache<String, Object> caffeineCache;
...
public void fun(String key) {
caffeineCache.put(key,"I am Lvshen");
}
注釈の形で定義することもできます。
Mavenの依存関係を導入する
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>
<dependency>
<groupId>com.github.ben-manes.caffeine</groupId>
<artifactId>caffeine</artifactId>
</dependency>
構成を構成する
次のように使用します。
@CachePut(key = "#userInfo.id")
public void addUser(User userInfo) {
//这里模拟存入数据库中
userMap.put(userInfo.getId(), userInfo);
}
@Cacheable(key = "#id")
public User getByName(Integer id) {
//先从缓存中获取,缓存中没有,再从数据库中获取
return userMap.get(id);
}
このようにして、SpringBootとCaffeineの統合使用も実現できます。
公式文書
この記事はカフェインの紹介に過ぎません。子供靴についてもっと知りたい場合は、公式文書を確認してください。
公式文書
カフェインの公式ドキュメントは次のとおりです。
「「(https://github.com/ben-manes/caffeine/wiki/Policy-zh-CN)
」