キャッシュ戦略

Java におけるコードの最適化

Pavlos Kosmetatos

Lead Engineer @Wealthyhood

キャッシュとは?

キャッシュとは、よく使う調理器具を戸棚ではなくキッチンカウンターに置いておくようなものです。取り出しやすい反面、置けるスペースには限りがあります。

よくキャッシュされるものには、次のようなものがあります。

  • データベースのクエリ結果
  • API のレスポンス
  • 負荷の高い計算処理
  • その他、リソースを多く消費する処理
Java におけるコードの最適化

Java におけるインメモリキャッシュ

// In-memory cache using HashMap
public class SimpleCache<K, V> {
    private final Map<K, V> cache = new HashMap<>();

    public V get(K key) {
        return cache.get(key);
    }

    public void put(K key, V value) {
        cache.put(key, value);
    }
}
Java におけるコードの最適化

キャッシュ削除ポリシー

  • LRU(最も使用されていない期間が長いものから削除)
  • LFU(使用頻度が最も低いものから削除)
  • FIFO(先入れ先出し)
  • 時間ベースの有効期限
  • その他にも多数!
Java におけるコードの最適化

分散キャッシュのための Redis

Redis とは:

  • インメモリデータストア/キャッシュ
  • 分散キャッシュとして優れた性能を発揮
  • 多様なデータ構造をサポート
  • Java 用クライアントライブラリも豊富(例:Jedis)

Screenshot 2025-05-14 at 6.59.29 PM.png

Java におけるコードの最適化

Jedis を使った Redis の利用

import redis.clients.jedis.Jedis;

// Using Jedis client
Jedis jedis = new Jedis("localhost");
jedis.set("key", "value");
String value = jedis.get("key");

追加機能:

  • キャッシュ項目の自動有効期限設定
  • クラスタ対応
Java におけるコードの最適化

Redis で時間ベースのキャッシュを実装する

public class RedisTimedCache {
    private final Jedis jedis;

    public RedisTimedCache(String host, int port) {
        this.jedis = new Jedis(host, port);
    }

    public String get(String key) {
        return jedis.get(key);
    }

    public void put(String key, String value, int timeToLiveSeconds) {
        // Sets both the value and expiration time in seconds
        jedis.setex(key, timeToLiveSeconds, value);
    }
}
Java におけるコードの最適化

まとめ

  • キャッシュは計算結果を保存し、再計算を回避します
  • 負荷の高い処理や頻繁にアクセスされるデータに効果的です
  • メモリ管理のため、適切な削除ポリシーを実装しましょう
  • 複数サーバーで動作するアプリケーションには、分散キャッシュ(例:Jedis を使った Redis)の利用も検討しましょう
Java におけるコードの最適化

練習しましょう!

Java におけるコードの最適化

Preparing Video For Download...