PHpullh
학습 라이브러리/Kotlin/캐싱 전략 (Caching)

KOTLIN · 성능

캐싱 전략 (Caching)

다양한 캐싱 전략을 구현합니다. TTL, LRU, Write-through 캐시로 성능과 일관성을 확보합니다.

성능중급cachinglruttlperformance

핵심 설명

다양한 캐싱 전략을 구현합니다. TTL, LRU, Write-through 캐시로 성능과 일관성을 확보합니다.

Kotlin code

class LRUCache<K, V>(private val maxSize: Int) {
    private val cache = LinkedHashMap<K, V>(maxSize, 0.75f, true)

    fun get(key: K): V? = cache[key]

    fun put(key: K, value: V) {
        cache[key] = value
        if (cache.size > maxSize) {
            val eldest = cache.keys.first()
            cache.remove(eldest)
        }
    }

    val size get() = cache.size
    fun stats() = "크기: $size/$maxSize"
}

class TTLCache<K, V>(private val ttlMs: Long) {
    private data class Entry<V>(val value: V, val expiry: Long)
    private val cache = mutableMapOf<K, Entry<V>>()

    fun get(key: K): V? {
        val entry = cache[key] ?: return null
        if (System.currentTimeMillis() > entry.expiry) {
            cache.remove(key)
            return null
        }
        return entry.value
    }

    fun put(key: K, value: V) {
        cache[key] = Entry(value, System.currentTimeMillis() + ttlMs)
    }
}

fun main() {
    // LRU 캐시
    val lru = LRUCache<String, Int>(3)
    lru.put("a", 1); lru.put("b", 2); lru.put("c", 3)
    lru.get("a")  // a를 최근 사용으로 이동
    lru.put("d", 4)  // b가 제거됨 (가장 오래 미사용)
    println("LRU a: ${lru.get("a")}")  // 1
    println("LRU b: ${lru.get("b")}")  // null (제거됨)
    println(lru.stats())

    // TTL 캐시
    val ttl = TTLCache<String, String>(500) // 500ms TTL
    ttl.put("token", "abc123")
    println("즉시: ${ttl.get("token")}")     // abc123
    Thread.sleep(600)
    println("만료 후: ${ttl.get("token")}")   // null
}

학습 팁

읽기가 빈번하고 데이터 변경이 적은 경우 LRU 캐시가 적합합니다. 실시간성이 중요하면 TTL을 짧게 설정하세요.

주의할 점

캐시 무효화는 어려운 문제입니다. 데이터 변경 시 캐시를 즉시 갱신하는 write-through 전략이나 이벤트 기반 무효화를 고려하세요.

자주 묻는 질문

캐싱 전략 (Caching)란 무엇인가요?

다양한 캐싱 전략을 구현합니다. TTL, LRU, Write-through 캐시로 성능과 일관성을 확보합니다.

캐싱 전략 (Caching) 학습 시 주의할 점은 무엇인가요?

캐시 무효화는 어려운 문제입니다. 데이터 변경 시 캐시를 즉시 갱신하는 write-through 전략이나 이벤트 기반 무효화를 고려하세요.