ホームページ  >  記事  >  Java  >  Java キャッシュ テクノロジでのキャッシュ遅延ロード

Java キャッシュ テクノロジでのキャッシュ遅延ロード

王林
王林オリジナル
2023-06-20 12:24:101391ブラウズ

Java キャッシュ テクノロジにおけるキャッシュ遅延ローディング

Java サークルでは、キャッシュ テクノロジは非常に一般的なテクノロジです。キャッシュの目的は、データ アクセスのパフォーマンスを向上させ、計算の繰り返しやリクエストの繰り返しを回避することです。キャッシュ テクノロジには幅広いアプリケーション シナリオがあり、特に、電子商取引 Web サイト、ニュース ポータル、ソーシャル アプリケーションなど、データへの頻繁なアクセスが必要なアプリケーションで役立ちます。

ただし、キャッシュ テクノロジには、キャッシュの初期化と更新に多くの時間とパフォーマンス リソースが消費される可能性があるなど、いくつかの欠点もあります。したがって、キャッシュのパフォーマンスと効率を向上させるために、キャッシュの初期化と更新の問題を効果的に解決できる「キャッシュ遅延ローディング」と呼ばれるテクノロジーが登場し、それによってシステムのパフォーマンスと効率が向上します。

キャッシュ遅延読み込みとは何ですか?

キャッシュの遅延ロードとは、キャッシュされたデータの初期化を遅らせ、最初のアクセスを待ってからデータをキャッシュにロードすることを意味します。このテクノロジーの利点は、不必要な初期化と更新操作を回避できるため、システムのオーバーヘッドとリソースの消費が削減されることです。もちろん、キャッシュの遅延読み込みの欠点は、最初のアクセス時に遅延が発生する可能性があることですが、ほとんどのアプリケーション シナリオでは、この遅延は許容範囲です。したがって、キャッシュ遅延読み込みテクノロジは、多くのアプリケーションで非常に一般的なテクノロジです。

キャッシュ遅延ローディングの実装方法

Java ではキャッシュ遅延ローディングを実装する方法が多数ありますが、ここでは一般的な実装方法をいくつか紹介します。

方法 1: ConcurrentHashMap と Future を使用して実装する

ConcurrentHashMap は、JDK 1.5 で導入されたスレッドセーフなハッシュ テーブルであり、キャッシュされたデータの保存に使用でき、Future は読み込みに使用できます。データを非同期的に取得します。

具体的な実装方法は次のとおりです。

public class MyCache {
    private final Map<String, Future<String>> cache = new ConcurrentHashMap<>();
    private final Function<String, String> loadDataFunction;

    public MyCache(Function<String, String> loadDataFunction) {
        this.loadDataFunction = loadDataFunction;
    }

    public String getData(String key) throws ExecutionException, InterruptedException {
        Future<String> future = cache.get(key);

        if (future == null) {
            Callable<String> callable = () -> loadDataFunction.apply(key);
            FutureTask<String> futureTask = new FutureTask<>(callable);
            future = cache.putIfAbsent(key, futureTask);  
            if (future == null) {
                future = futureTask;
                futureTask.run();
            }
        }
        return future.get();
    }
}

この実装方法は比較的単純で、一般的なプロセスは次のとおりです。

  1. Future を取得してみるキャッシュからの指定されたキーの値;
  2. Future 値が null の場合、対応するデータがキャッシュされていないことを意味します。loadDataFunction を通じてデータをロードし、それを FutureTask オブジェクトにカプセル化して、キャッシュ;
  3. 挿入が成功した場合 (つまり、他のスレッドがキーを挿入する前)、FutureTask を実行してデータを非同期でロードします;
  4. 最後に、Future 値を返しますキャッシュ内の指定されたキーに対応します。

方法 2: ダブルチェック ロックを使用して実現する

ダブルチェック ロックは、ロックの繰り返しの競合を回避し、システムのパフォーマンスを向上させることができる一般的なマルチスレッド プログラミング手法です。キャッシュの遅延読み込みでは、二重チェック ロック手法を使用して、遅延初期化の効果を実現できます。

具体的な実装方法は次のとおりです。

public class MyCache {
    private Map<String, String> cache = null;

    public String getData(String key) {
        String data = cache.get(key);
        if (data == null) {
            synchronized (this) {
                data = cache.get(key);

                if (data == null) {
                    data = loadData(key);
                    cache.put(key, data);
                }
            }
        }
        return data;
    }

    private String loadData(String key) {
        // TODO: load data from database or remote API
        return "data";
    }
}

この実装方法は比較的単純で、大まかな流れは次のとおりです。

  1. 値を取得してみるキャッシュからの指定されたキーの
  2. 値が null の場合、同期されたコード ブロックを実行します;
  3. 同期されたコード ブロックで、キャッシュされたデータを再度取得してみます。 null の場合は、loadData メソッドを呼び出してデータをロードし、キャッシュ内に保存します。
  4. 最後に、指定されたキーに対応するデータを返します。

方法 3: AtomicReference を使用して実装する

AtomicReference は、JDK 1.5 で導入されたアトミック操作クラスであり、キャッシュされた遅延読み込みの効果を実現するために使用できます。

具体的な実装方法は以下の通りです:

public class MyCache {
    private final Map<String, String> cache = new ConcurrentHashMap<>();
    private final AtomicReference<Map<String, String>> reference =
            new AtomicReference<>(null);

    public String getData(String key) {
        Map<String, String> currentCache = reference.get();

        if (currentCache == null) {
            currentCache = cache;
            reference.compareAndSet(null, currentCache);
        }

        return currentCache.computeIfAbsent(key, k -> loadData(k));
    }

    private String loadData(String key) {
        // TODO: load data from database or remote API
        return "data";
    }
}

この実装方法は比較的複雑ですが、おおよその手順は以下の通りです:

  1. キャッシュデータを読み込んでみるリファレンスが指す;
  2. キャッシュされたデータが null の場合は、ConcurrentHashMap からデータを読み取り、元のデータとして AtomicReference に格納します;
  3. 次に、computeIfAbsent メソッドを使用して、対応するデータを取得しますキャッシュされたデータから指定したキーに;
  4. 指定したキーに対応するデータが存在しない場合は、loadData メソッドを呼び出してデータを読み込み、キャッシュ データに格納してデータを返します。

キャッシュされた遅延読み込みを使用する利点は何ですか?

キャッシュ遅延読み込みテクノロジを使用すると、次の利点が得られます:

  1. 初期化と更新のオーバーヘッドとリソース消費の削減;
  2. 無駄な計算とリクエストの操作を回避;
  3. システムの応答速度とスループットを向上させます;
  4. システムのメモリ使用量とオーバーヘッドを削減します;
  5. システムの保守性と拡張性を向上させます。

概要

Java キャッシュ テクノロジでは、キャッシュの遅延読み込みは非常に実用的なテクノロジです。キャッシュされたデータの初期化を遅らせることにより、不必要な計算やリクエスト操作が回避され、システムのパフォーマンスと効率が向上します。この記事では、誰もが Java キャッシュ テクノロジをより深く理解し、習得できるようにするために、いくつかの一般的なキャッシュ遅延読み込みの実装方法を紹介します。

以上がJava キャッシュ テクノロジでのキャッシュ遅延ロードの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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