java redis caching: JavaでRedisを使用したドキュメントキャッシュ

モダンなウェブアプリケーションでは、同じ変換済みドキュメントを繰り返し提供することで CPU サイクルが無駄になり、応答時間が伸びてしまいます。java redis caching は、変換結果を高速なインメモリデータストアに保存することでこの問題を解決し、以降のリクエストを瞬時に返せるようにします。このチュートリアルでは、Redis を GroupDocs.Conversion のワークフローに組み込み、TTL を設定し、期待できるパフォーマンス向上を測定する方法を学びます。

クイック回答

  • このチュートリアルで扱う内容は? Redis と GroupDocs.Conversion を統合する完全な java redis caching チュートリアルです。
  • なぜ Redis を使うのか? ミリ秒未満のレイテンシを提供し、TTL の有効期限をサポートし、複数のアプリインスタンスにまたがって水平スケーリングできます。
  • GroupDocs のライセンスは必要か? テスト用にはトライアルまたは一時ライセンスで問題ありません。本番環境ではフルライセンスが必要です。
  • 主な手順は? Maven 依存関係を追加し、JedisPool を設定し、キャッシュヘルパーメソッドを作成し、変換パイプラインにキャッシュを組み込みます。
  • 対応している Java バージョンは? Java 8+(最新の GroupDocs.Conversion リリースと互換性あり)。

Redisでドキュメントをキャッシュするとは?

Redis でドキュメントをキャッシュするとは、変換後のバイナリ出力(例: PDF バイト配列)を Redis に永続化し、同一の将来リクエストがキャッシュされたバイト列を取得できるようにすることです。これにより冗長な CPU 作業が排除され、ネットワーク帯域が削減され、エンドユーザー体験が向上します。

JavaでRedisキャッシュを実装する理由は?

ドキュメントを一度だけロードし、結果を保存して、再リクエスト時に即座に提供できます。Redis バックのキャッシュは、頻繁にアクセスされるファイルの 変換時間を最大 90 % 短縮 し、CPU 使用率を削減 してインフラコストを下げ、クラスタ環境のすべてのアプリケーションノードで 単一の真実の情報源 を提供します。

前提条件

  • GroupDocs.Conversion – バージョン 25.2 以上(120+ の入力・出力フォーマットに対応)。
  • Jedis(Java 用公式 Redis クライアント)。
  • 稼働中の Redis インスタンス(ローカル開発ではデフォルトの localhost:6379 を使用可能)。
  • 依存関係管理のための Maven。
  • Java の例外処理と I/O ストリームに関する基本的な知識。

Java向けGroupDocs.Conversionの設定

GroupDocs.Conversion は、レイアウト保持、フォント埋め込み、画像抽出を自動的に処理しながら、幅広いフォーマットへドキュメントを変換・レンダリングする Java ライブラリです。

pom.xml に GroupDocs リポジトリと依存関係を追加します:

<repositories>
    <repository>
        <id>groupdocs-maven</id>
        <url>https://repo.groupdocs.com/maven</url>
    </repository>
</repositories>

<dependencies>
    <dependency>
        <groupId>com.groupdocs</groupId>
        <artifactId>groupdocs-conversion</artifactId>
        <version>25.2.0</version>
    </dependency>
    <dependency>
        <groupId>redis.clients</groupId>
        <artifactId>jedis</artifactId>
        <version>4.2.3</version>
    </dependency>
</dependencies>

ライセンス取得

Free TrialTemporary License(評価用)を開始するか、または本番利用向けにフル License を購入できます。

Java コードで GroupDocs.Conversion を初期化します:

import com.groupdocs.conversion.*;

ConversionConfig config = new ConversionConfig();
config.setLicensePath("path/to/license/file.lic");
ConversionApi conversionApi = new ConversionApi(config);

実装ガイド

Redisを使用したカスタムキャッシュの作成

概要

カスタム Redis キャッシュは、レンダリングされたドキュメントバイト列を保持し、再リクエスト時に即座に取得できるようにします。

JedisPoolの設定

JedisPool は再利用可能な Redis 接続のスレッドセーフプールで、ソケットオーバーヘッドを最小化しスループットを向上させます。

import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;

JedisPoolConfig poolConfig = new JedisPoolConfig();
poolConfig.setMaxTotal(20);               // maximum active connections
poolConfig.setMaxIdle(10);                // maximum idle connections
poolConfig.setMinIdle(2);                 // minimum idle connections
JedisPool jedisPool = new JedisPool(poolConfig, "localhost", 6379);

キャッシュデータの保存と取得

以下のヘルパーメソッドは、バイト配列を安全に保存できる Base64 文字列にシリアライズし、再びバイト配列に復元します。

import java.util.Base64;
import redis.clients.jedis.Jedis;

public class RedisCacheHelper {

    private final JedisPool pool;
    private final int ttlSeconds; // time‑to‑live for cached entries

    public RedisCacheHelper(JedisPool pool, int ttlSeconds) {
        this.pool = pool;
        this.ttlSeconds = ttlSeconds;
    }

    public void put(String key, byte[] data) {
        try (Jedis jedis = pool.getResource()) {
            String encoded = Base64.getEncoder().encodeToString(data);
            jedis.setex(key, ttlSeconds, encoded); // configure redis ttl
        }
    }

    public byte[] get(String key) {
        try (Jedis jedis = pool.getResource()) {
            String encoded = jedis.get(key);
            return encoded != null ? Base64.getDecoder().decode(encoded) : null;
        }
    }
}

GroupDocs.Conversionとの統合

キャッシュを変換ワークフローに組み込みます。メソッドはまずキャッシュを確認し、ヒットしなければ変換を実行して結果を保存し、バイト列を返します。

import com.groupdocs.conversion.options.convertoptions.PdfConvertOptions;

public class DocumentService {

    private final ConversionApi conversionApi;
    private final RedisCacheHelper cacheHelper;

    public DocumentService(ConversionApi conversionApi, RedisCacheHelper cacheHelper) {
        this.conversionApi = conversionApi;
        this.cacheHelper = cacheHelper;
    }

    public byte[] convertToPdf(String sourcePath, PdfConvertOptions options) throws Exception {
        // Build a deterministic cache key
        String cacheKey = "pdf:" + sourcePath + ":" + options.hashCode();

        // Attempt to fetch from Redis
        byte[] cached = cacheHelper.get(cacheKey);
        if (cached != null) {
            // Cache hit – return stored bytes
            return cached;
        }

        // Cache miss – perform conversion
        byte[] result = conversionApi.convert(sourcePath, options).toByteArray();

        // Store result for future calls
        cacheHelper.put(cacheKey, result);
        return result;
    }
}

java redis cachingの実装方法は?

ConversionApi は GroupDocs.Conversion の主要クラスで、ドキュメント変換操作を実行します。

ソースドキュメントをロードし、決定的なキャッシュキーを生成して Redis で検索し、キーが存在しない場合にのみ ConversionApi を呼び出します。このパターンにより、各ユニーク変換は一度だけ実行され、設定した TTL の間キャッシュから提供されます。

トラブルシューティングのヒント

  • Redis サーバーへの接続が可能か確認(redis-cli pingPONG を返すはず)。
  • JedisPool のホストとポートが Redis デプロイと一致していることを確認。
  • キャッシュ呼び出しを try‑catch でラップし、接続障害が変換フローを破壊しないようにする。
  • Redis のメモリ使用状況を監視(INFO memory)し、maxmemory ポリシー(例: volatile-lru)を設定して古いエントリを適切に削除。
  • JVM で OutOfMemoryError が発生した場合はヒープサイズを増やすか、-XX:+UseCompressedOops を有効化。

実用的な応用例

  1. 高トラフィックポータル – カタログやホワイトペーパーなど頻繁に要求される PDF を即座に提供。
  2. エンタープライズ DMS – 同一の契約書やポリシードキュメントを繰り返し閲覧するユーザーの負荷を軽減。
  3. E‑コマース – 請求書や商品カタログをキャッシュしてチェックアウト速度を向上。
  4. 学習プラットフォーム – 講義ノートや電子書籍を再レンダリングせずに配信。
  5. 法務サービス – ケースファイルの配布を高速化し、ストレージコストを低減。

パフォーマンス上の考慮点

  • Redis のチューニングmaxmemory を調整し、allkeys-lru などの除外ポリシーを選択し、トラフィックパターンに合わせて timeout を設定。
  • キャッシュヒット/ミス率の追跡INFO statskeyspace_hits / keyspace_misses カウンタを使用して TTL を微調整。
  • JVM ヒープサイズ – GroupDocs のバッファを収容できるようにする。目安は同時変換ペイロード 100 MB あたり 1 GB ヒープ。
  • バッチ変換 – 多数のファイルを変換する際は、スレッドごとに単一の Jedis インスタンスを再利用してソケットの churn を最小化。

よくある質問

Q: このアプローチは他の GroupDocs 出力フォーマットでも使用できますか?
A: もちろんです。同じキャッシュパターンは DOCX、HTML、画像などでも機能します – ConvertOptions の型を変更するだけです。

Q: 良いキャッシュキーの選び方は?
A: ソースファイルパス、変換オプション、バージョン識別子を組み合わせます。これにより設定ごとの一意性が保証されます。

Q: ドキュメントがキャッシュ後に変更された場合は?
A: キーを手動で削除してキャッシュを無効化するか、短めの TTL を設定して古いデータがすぐに期限切れになるようにします。

Q: Redis 以外のキャッシュ手段はありますか?
A: ありますが、Redis は低レイテンシ、組み込み TTL、豊富な Java クライアントサポートを提供するため、このシナリオで人気があります。

Q: アプリケーションサーバーのメモリ使用量は増えますか?
A: 最小限です。重い処理は Redis が担当し、アプリ側は Jedis 経由の短命接続だけを保持します。

結論

これで java redis caching の完全なチュートリアルが完成しました。Redis と GroupDocs.Conversion を使ってドキュメントをキャッシュする方法を示しました。レンダリング結果を Redis に永続化することで、描画パフォーマンスが向上し、変換時間が短縮され、エンドユーザーによりスムーズな体験を提供できます。さまざまな TTL 値を試し、キャッシュ指標を監視し、アプリケーションが成長するにつれて他のドキュメント形式にもパターンを拡張してください。


Last Updated: 2026-07-19
Tested With: GroupDocs.Conversion 25.2, Jedis 4.2.3
Author: GroupDocs

<repositories>
   <repository>
      <id>repository.groupdocs.com</id>
      <name>GroupDocs Repository</name>
      <url>https://releases.groupdocs.com/conversion/java/</url>
   </repository>
</repositories>

<dependencies>
   <dependency>
      <groupId>com.groupdocs</groupId>
      <artifactId>groupdocs-conversion</artifactId>
      <version>25.2</version>
   </dependency>
</dependencies>
import com.groupdocs.conversion.Converter;
import com.groupdocs.conversion.options.convert.PdfConvertOptions;

public class DocumentConversion {
    public static void main(String[] args) {
        // Initialize the Converter with a document path
        Converter converter = new Converter("input.docx");
        
        // Set up conversion options for PDF
        PdfConvertOptions options = new PdfConvertOptions();
        converter.convert("output.pdf", options);
    }
}
import redis.clients.jedis.JedisPool;

public class CacheManager {
    private static JedisPool jedisPool = new JedisPool("localhost", 6379);
    
    public static void main(String[] args) {
        // Additional cache setup code here
    }
}
import redis.clients.jedis.Jedis;

public class CacheManager {

    public static void storeDocument(String key, String documentContent) {
        try (Jedis jedis = jedisPool.getResource()) {
            // Set the content in Redis cache with an expiration time of one hour
            jedis.setex(key, 3600, documentContent);
        }
    }

    public static String retrieveDocument(String key) {
        try (Jedis jedis = jedisPool.getResource()) {
            return jedis.get(key); // Retrieve cached content if available
        }
    }
}
public class DocumentConversion {

    public static void convertWithCache(String inputPath, String outputPath) {
        Converter converter = new Converter(inputPath);
        PdfConvertOptions options = new PdfConvertOptions();

        // Generate a cache key based on the document path and conversion settings
        String cacheKey = "doc:" + inputPath;

        // Check if the converted document is already cached
        String cachedDocument = CacheManager.retrieveDocument(cacheKey);

        if (cachedDocument != null) {
            System.out.println("Using cached version of the document.");
            // Save cached content to output file
            Files.write(Paths.get(outputPath), cachedDocument.getBytes());
        } else {
            // Perform conversion and cache the result
            converter.convert(output -> {
                String documentContent = new String(output.toByteArray());
                CacheManager.storeDocument(cacheKey, documentContent);
                Files.write(Paths.get(outputPath), output.toByteArray());
            }, options);
        }
    }

    public static void main(String[] args) {
        convertWithCache("input.docx", "output.pdf");
    }
}

関連チュートリアル