DB/Redis

[Redis] Redis 캐싱 전략

웅지니어링 2025. 3. 5. 10:01

* Redis 캐싱

Redis 캐싱이란, redis 캐시에서 접근해서 데이터를 빠르게 가져오는 방식이다.

 

* Cache Aside 전략

Cache Aside 전략은 look aside 전략 또는 lazy loading 전략이라고 부른다.

예시를 통해 cache aside 전략의 작동 방식을 알아보자.

- 게시판 서비스 배포

  1. 처음 게시판 서비스를 배포했기 때문에 DB와 redis에는 데이터가 저장이 되어있지 않다.
  2. user가 들어와 게시글 작성을 함으로써 데이터를 저장한다. 이 데이터는 DB에 저장된다. 여기서 주의할 점은 redis에는 저장이 되지 않는다는 점이다.
  3. 사용자가 데이터를 조회하려고 요청한다. 이 때, DB로부터 조회를 하기 전, redis에 데이터가 존재하는지 먼저 확인한다.
  4. redis에 데이터가 없는 것을 확인한 후 DB로부터 데이터를 조회해서 응답한다.
  5. DB로부터 조회한 데이터를 응답한 뒤에 redis에도 데이터를 저장한다.
  6. 다시 한번 사용자가 데이터를 조회하려고 요청한다.
  7. 이 때, redis에 데이터가 존재하는지 확인한다. 현재 redis에 데이터가 존재하므로 redis로부터 데이터를 가져온다.

  • 캐시에 데이터가 있을 경우

데이터를 요청했을 때 캐시에 데이터가 존재하는 경우를 Cache Hit라고 한다.

 

  • 캐시에 데이터가 없는 경우

데이터를 요청했을 때 캐시에 데이터가 존재하지 않는 경우를 Cache Miss라고 한다.

 

즉, Cache Aside 전략은 캐시에서 데이터를 확인하고, 없다면 DB를 통해 조회해오는 방식이다.

 

* Write Around 전략

Cache Aside 전략이 데이터를 어떻게 조회할지에 대한 전략이었다면, Write Around 전략은 데이터를 어떻게 쓸지(저장, 수정, 삭제)에 대한 전략이다.

Write Around 전략은 매우 간단한데, 데이터에 저장할 때 redis가 아니라 DB에만 저장하는 방식이다.

그리고 데이터를 조회할 때, redis에 데이터가 없으면 데이터베이스로부터 데이터를 조회해서 redis에 저장하는 방식이다.

 

즉, Write Around 전략은 쓰기 작업(저장, 수정, 삭제)을 캐시에 반영하지 않고, DB에만 반영하는 방식이다.

 

* Cache Aside, Write Around 전략의 한계

1. 캐시된 데이터와 DB 데이터가 일치하지 않을 수 있다.

Cache Aside와 Write Around 전략을 같이 썼을 때의 한계점 중 하나는 캐시된 데이터와 DB 데이터가 일치하지 않을 수 있다는 것이다. 즉, 요약하자면 데이터의 일관성을 보장할 수 없다는 것이 된다.

Write Around 전략은 데이터를 수정할 때, DB에만 업데이트를 시키기 때문에 기존에 저장된 redis의 데이터 값과 DB의 데이터 값은 다를 수 있다.

 

2. 캐시에 저장할 수 있는 공간이 비교적 작다.

DB는 디스크에 저장해서 다량의 데이터를 저장하기 용이하지만, 캐시는 메모리(RAM)에 저장하기 때문에 DB에 비해 많은 양의 데이터를 저장할 수 없다.

 

* 해결 방법

1. 캐시된 데이터와 DB 데이터가 일치하지 않을 수 있다.

캐시와 DB 데이터를 일치시키기 위해 데이터를 수정할 때마다 동시에 업데이트하면 성능적으로 느려진다.

그렇다고 성능 향상을 위해 DB의 데이터만 업데이트하면 캐시와 DB의 데이터가 일치하지 않게 되므로 데이터의 일관성이 무너진다. 그렇다면 언제 캐싱을 적용해야 하는가?

 

  • 자주 조회되는 데이터
  • 자주 변하지 않는 데이터
  • 실시간으로 정확하게 일치하지 않아도 되는 데이터

하지만 장기간 데이터가 일치하지 않는건 문제가 될 수 있다. 따라서 적당한 주기마다 데이터를 동기화해야 한다.

이 때 활용하는 기능이 redis의 만료 시간(TTL)이다. TTL을 활용하면 어떻게 해결되는지 과정을 보자.

- TTL 적용

  1. 일정 시간이 경과하면 데이터가 캐시에서 삭제된다.
  2. 사용자가 조회를 하게 되면 cache miss가 발생한다.
  3. DB의 데이터를 새로 조회해서 캐시에 데이터를 넣는다.
  4. 데이터가 갱신된다.

2. 캐시에 저장할 수 있는 공간이 비교적 작다.

TTL을 적용하면 캐시의 공간을 효율적으로 사용할 수 있다. 자주 조회되지 않는 데이터는 TTL에 의해서 데이터가 삭제되기 때문이다.