Cache4k

キャッシュライブラリKotlinLRUメモリキャッシュコルーチンマルチプラットフォーム

キャッシュライブラリ

Cache4k

概要

Cache4kは、KotlinネイティブおよびKotlin Multiplatformプロジェクト向けに設計された軽量で高性能なインメモリキャッシュライブラリです。

詳細

Cache4kは、Kotlinエコシステム向けに特別に設計されたメモリキャッシュライブラリで、LRU(Least Recently Used)エビクションポリシーをサポートしています。ライブラリは外部依存関係を持たず、完全にKotlinで書かれているため、Kotlin/JVM、Kotlin/JS、Kotlin/Nativeを含むすべてのKotlinプラットフォームで動作します。コルーチンに対応した非同期API設計により、現代的なKotlinアプリケーションとスムーズに統合できます。Type-safeなAPIにより、コンパイル時に型安全性が保証され、実行時エラーを削減できます。シンプルなAPIでありながら、カスタマイズ可能な設定オプションを提供し、様々なユースケースに対応可能です。軽量設計のため、リソース制約のある環境でも効率的に動作し、Android開発やサーバーサイドKotlinアプリケーションでの利用に適しています。

メリット・デメリット

メリット

  • Kotlin特化設計: Kotlinの言語特性を活かした自然なAPI設計
  • マルチプラットフォーム対応: Kotlin/JVM、Kotlin/JS、Kotlin/Nativeで動作
  • 軽量: 外部依存関係なしでアプリケーションのバンドルサイズを最小化
  • コルーチン対応: 非同期処理との親和性が高い
  • 型安全: コンパイル時の型チェックによるエラー削減
  • 高性能: LRUアルゴリズムによる効率的なメモリ管理
  • シンプルAPI: 学習コストが低く直感的な操作

デメリット

  • Kotlin専用: 他の言語からの利用は不可
  • メモリキャッシュのみ: 永続化機能なし
  • 機能制限: 高度なキャッシュ機能(分散、レプリケーション等)は未対応
  • エコシステム: まだ比較的新しく、実績が限定的
  • ドキュメント: 大規模ライブラリと比較してドキュメントが少ない

主要リンク

書き方の例

基本的なキャッシュ使用

import io.github.reactivecircus.cache4k.Cache

// キャッシュのインスタンス作成
val cache = Cache.Builder<String, String>()
    .maximumCacheSize(100)
    .build()

// データの保存
cache.put("key1", "value1")

// データの取得
val value = cache.get("key1")
println(value) // "value1"

有効期限の設定

import kotlin.time.Duration.Companion.minutes

// 有効期限付きキャッシュ
val cache = Cache.Builder<String, String>()
    .maximumCacheSize(100)
    .expireAfterWrite(10.minutes)
    .build()

// データ保存(10分後に自動削除)
cache.put("session", "user123")

// 有効期限チェック
if (cache.get("session") != null) {
    println("セッションが有効です")
}

カスタムローダーの使用

// キャッシュミス時の自動ロード
val cache = Cache.Builder<String, String>()
    .maximumCacheSize(50)
    .build()

// getOrPutを使用した自動ロード
val value = cache.getOrPut("user:123") {
    // データベースから取得する処理
    fetchUserFromDatabase("123")
}

コルーチンでの非同期使用

import kotlinx.coroutines.runBlocking

suspend fun fetchDataAsync(key: String): String {
    // 非同期データ取得処理
    return "async_data_for_$key"
}

runBlocking {
    val cache = Cache.Builder<String, String>()
        .maximumCacheSize(100)
        .build()
    
    // 非同期でキャッシュ操作
    val result = cache.getOrPut("async_key") {
        fetchDataAsync("async_key")
    }
    
    println(result) // "async_data_for_async_key"
}

キャッシュ統計の取得

// 統計情報の有効化
val cache = Cache.Builder<String, String>()
    .maximumCacheSize(100)
    .recordStats()
    .build()

// データ操作
cache.put("key1", "value1")
cache.get("key1")
cache.get("key2") // キャッシュミス

// 統計情報の取得
val stats = cache.stats()
println("ヒット率: ${stats.hitRate}")
println("ミス数: ${stats.missCount}")
println("エビクション数: ${stats.evictionCount}")

Androidでの実用例

class UserRepository(
    private val apiService: ApiService
) {
    // ユーザー情報のキャッシュ(5分間)
    private val userCache = Cache.Builder<String, User>()
        .maximumCacheSize(100)
        .expireAfterWrite(5.minutes)
        .build()
    
    suspend fun getUser(userId: String): User {
        return userCache.getOrPut(userId) {
            apiService.fetchUser(userId)
        }
    }
    
    fun clearUserCache() {
        userCache.invalidateAll()
    }
}