PHpullh

GO · 성능

캐싱 전략

인메모리 캐시로 반복 연산을 줄입니다. TTL, LRU, 동시성 안전한 캐시를 구현합니다.

성능고급cachettlconcurrentgenerics

핵심 설명

인메모리 캐시로 반복 연산을 줄입니다. TTL, LRU, 동시성 안전한 캐시를 구현합니다.

Go code

package main

import (
	"fmt"
	"sync"
	"time"
)

type CacheItem[V any] struct {
	Value     V
	ExpiresAt time.Time
}

type Cache[K comparable, V any] struct {
	mu    sync.RWMutex
	items map[K]CacheItem[V]
	ttl   time.Duration
}

func NewCache[K comparable, V any](ttl time.Duration) *Cache[K, V] {
	return &Cache[K, V]{
		items: make(map[K]CacheItem[V]),
		ttl:   ttl,
	}
}

func (c *Cache[K, V]) Get(key K) (V, bool) {
	c.mu.RLock()
	defer c.mu.RUnlock()
	item, ok := c.items[key]
	if !ok || time.Now().After(item.ExpiresAt) {
		var zero V
		return zero, false
	}
	return item.Value, true
}

func (c *Cache[K, V]) Set(key K, value V) {
	c.mu.Lock()
	defer c.mu.Unlock()
	c.items[key] = CacheItem[V]{
		Value:     value,
		ExpiresAt: time.Now().Add(c.ttl),
	}
}

func main() {
	cache := NewCache[string, int](5 * time.Second)
	cache.Set("count", 42)

	if v, ok := cache.Get("count"); ok {
		fmt.Println("캐시 히트:", v)
	}

	if _, ok := cache.Get("missing"); !ok {
		fmt.Println("캐시 미스")
	}
}

학습 팁

캐시 TTL은 데이터 신선도와 성능 사이의 균형입니다. 변경이 드문 데이터는 긴 TTL, 자주 변하는 데이터는 짧은 TTL을 사용하세요.

주의할 점

캐시 만료를 확인하지 않으면 오래된 데이터를 반환합니다. 항상 TTL을 설정하고 만료된 항목을 정리하세요.

자주 묻는 질문

캐싱 전략란 무엇인가요?

인메모리 캐시로 반복 연산을 줄입니다. TTL, LRU, 동시성 안전한 캐시를 구현합니다.

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

캐시 만료를 확인하지 않으면 오래된 데이터를 반환합니다. 항상 TTL을 설정하고 만료된 항목을 정리하세요.