Redis · 2025-11-20 · 1분 읽기

Redis 캐시 전략 - Cache Aside부터 Write Through까지

목차
  • 1. Cache Aside (Lazy Loading)
  • 2. Write Through
  • 3. Write Behind (Write Back)
  • 4. Cache Eviction 전략

1. Cache Aside (Lazy Loading)

가장 널리 쓰이는 패턴이다. 애플리케이션이 직접 캐시와 DB를 모두 관리한다.

public User getUser(Long id) {
    String key = "user:" + id;
    User cached = redisTemplate.opsForValue().get(key);
 
    if (cached != null) {
        return cached;
    }
 
    User user = userRepository.findById(id).orElseThrow();
    redisTemplate.opsForValue().set(key, user, Duration.ofMinutes(30));
    return user;
}

장점: 실제로 읽힌 데이터만 캐싱된다. DB 장애 시 캐시로 fallback 가능. 단점: 첫 요청은 항상 DB 조회 (Cache Miss). 데이터 정합성 문제 발생 가능.

2. Write Through

쓰기 시 캐시와 DB를 동시에 업데이트한다.

public User updateUser(Long id, UserUpdateRequest req) {
    User user = userRepository.findById(id).orElseThrow();
    user.update(req);
    userRepository.save(user);
 
    // DB 저장과 동시에 캐시도 갱신
    String key = "user:" + id;
    redisTemplate.opsForValue().set(key, user, Duration.ofMinutes(30));
    return user;
}

장점: 캐시와 DB가 항상 동기화된다. 단점: 쓰기 레이턴시 증가. 읽히지 않는 데이터도 캐싱된다.

3. Write Behind (Write Back)

쓰기를 캐시에만 하고 DB 반영은 비동기로 처리한다.

public void updateViewCount(Long postId) {
    String key = "post:views:" + postId;
    redisTemplate.opsForValue().increment(key);
    // 실제 DB 반영은 스케줄러가 배치로 처리
}
 
@Scheduled(fixedDelay = 60000)
public void flushViewCounts() {
    Set<String> keys = redisTemplate.keys("post:views:*");
    for (String key : keys) {
        Long count = redisTemplate.opsForValue().get(key);
        Long postId = parsePostId(key);
        postRepository.updateViewCount(postId, count);
        redisTemplate.delete(key);
    }
}

장점: 쓰기 성능이 매우 빠르다. 단점: Redis 장애 시 데이터 유실 위험.

4. Cache Eviction 전략

정책설명적합한 상황
LRU가장 오래 전에 사용된 것 제거일반적인 캐시
LFU가장 적게 사용된 것 제거인기 데이터 유지
TTL만료 시간 기반 제거시간 민감 데이터
# redis.conf
maxmemory 256mb
maxmemory-policy allkeys-lru

'Redis ' 카테고리의 다른 글

  • 이 카테고리에 다른 글이 없습니다.