ホームページ >Java >&#&チュートリアル >Java に基づいて Redis マルチレベル キャッシュを実装する方法
リクエストが Tomcat に到達すると、まず Redis にアクセスしてキャッシュを取得します。
#2. マルチレベル キャッシュ ソリューション# Tomcat の同時リクエストの数 は Redis よりもはるかに小さいため、Tomcat がボトルネックになります
# #2. JVM ローカル キャッシュ
- 利点: 大容量のストレージ、信頼性が高く、クラスター内で共有できますローカル キャッシュを処理し、 HashMap、GuavaCache など-欠点: キャッシュへのアクセスにネットワーク オーバーヘッドが発生します
- シナリオ: 大量のキャッシュ データ、高信頼性、クラスター内に存在する必要がある共有データ
- 長所: ローカル メモリの読み取り、ネットワーク オーバーヘッドなし、高速- 短所: ストレージ容量が限られ、信頼性が低い (再起動後に失われるなど)、クラスター内で共有できない
1. 実際のケース
-シナリオ: 高パフォーマンス要件、少量のキャッシュ データ
<dependency> <groupId>com.github.ben-manes.caffeine</groupId> <artifactId>caffeine</artifactId> <version>3.0.5</version> </dependency>
package com.erick.cache; import com.github.benmanes.caffeine.cache.Cache; import com.github.benmanes.caffeine.cache.Caffeine; import java.time.Duration; public final class CacheUtil { private static int expireSeconds = 2; public static Cache<String, String> cacheWithExpireSeconds; private static int maxPairs = 1; public static Cache<String, String> cacheWithMaxPairs; static { /*过期策略,写完60s后过期*/ cacheWithExpireSeconds = Caffeine.newBuilder() .expireAfterWrite(Duration.ofSeconds(expireSeconds)) .build(); /*过期策略,达到最大值后删除 * 1. 并不会立即删除,等一会儿才会删除 * 2. 会将之前存储的数据删除掉*/ cacheWithMaxPairs = Caffeine.newBuilder() .maximumSize(maxPairs) .build(); } /*从缓存中获取数据 * 1. 如果缓存中有,则直接从缓存中返回 * 2. 如果缓存中没有,则去数据查询并返回结果*/ public static String getKeyWithExpire(String key) { return cacheWithExpireSeconds.get(key, value -> { return getResultFromDB(); }); } public static String getKeyWithMaxPair(String key) { return cacheWithMaxPairs.get(key, value -> { return getResultFromDB(); }); } private static String getResultFromDB() { System.out.println("数据库查询"); return "db result"; } }
package com.erick.cache; import java.util.concurrent.TimeUnit; public class Test { @org.junit.Test public void test01() throws InterruptedException { CacheUtil.cacheWithExpireSeconds.put("name", "erick"); System.out.println(CacheUtil.getKeyWithExpire("name")); TimeUnit.SECONDS.sleep(3); System.out.println(CacheUtil.getKeyWithExpire("name")); } @org.junit.Test public void test02() throws InterruptedException { CacheUtil.cacheWithMaxPairs.put("name", "erick"); CacheUtil.cacheWithMaxPairs.put("age", "12"); System.out.println(CacheUtil.getKeyWithMaxPair("name")); System.out.println(CacheUtil.getKeyWithMaxPair("age")); TimeUnit.SECONDS.sleep(2); System.out.println(CacheUtil.getKeyWithMaxPair("name")); // 查询不到了 System.out.println(CacheUtil.getKeyWithMaxPair("age")); } }
3. キャッシュの一貫性
利点: シンプルで便利
欠点: 適時性が低く、キャッシュの有効期限が切れる前にキャッシュが不整合になる可能性があります
シナリオ: 更新頻度が低く、適時性要件が低いビジネス
1.2 同期二重書き込み
利点: コードの侵入、キャッシュとデータベース間の強い一貫性
欠点:コード侵入、高結合
は Alibaba 傘下のオープン ソース プロジェクトで、Java 開発に基づいています
データベースの増分ログ分析に基づいて、増分データのサブスクリプションと消費を提供しますcanalはMySQLスレーブをシミュレートする対話型プロトコル、MySQLスレーブのふりをしてダンププロトコルをMySQLマスターに送信します
MySQLマスターはダンプを受信しますリクエストを実行し、バイナリ ログをスレーブ (つまり canal) にプッシュし始めます。以上がJava に基づいて Redis マルチレベル キャッシュを実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。