DBMS/Redis

[Redis] Redis를 이용한 캐시 활용하기

블로그 주인장 2023. 12. 30.

캐시(Cache) 란?

사용자에 입장에서 데이터를 더 빠르게, 더 효율적으로 엑세스 할 수 있는 임시 데이터 저장소를 뜻한다.

대부분의 어플리케이션에서 속도 향상을 위해 캐시를 사용한다.

 

캐시를 유용하게 사용하는 방법

캐시 저장소에 접근하는 속도가 원본 데이터 저장소(운영 DB)에 접근하는 속도보다 빨라야한다.

 

동일한 데이터에 대해 반복적으로 엑세스하는 상황이 많을 때 사용하는 것이 좋다.

즉, 데이터 재사용 횟수가 한 번 이상이어야 cache를 사용하는 의미가 있다.

 

잘 변하지 않는 데이터 일수록 cache를 사용할 때 효율적이다.

 

 

캐시로 Redis를 선택한 이유?

  • 서버가 이중화가 되어 있기 때문에 캐시 데이터 일관성을 위해 원격 캐시를 사용한다.
  • 단순한 key-value 구조로 다양한 자료구조(String, hash, JSON) 등 지원한다.
  • In-Memory 데이터 저장으로 인한 빠른 성능을 지원한다.(평균 작업 속도 < 1ms, 초당 수백만건의 작업이 가능하다)
  • 스프링에서 Redis 라이브러리를 지원한다.

 

캐싱 전략(Cache Strategies)

보통 Redis를 cache로 사용할 때 Redis를 어떻게 배치하냐에 따라 시스템의 전체 성능에 큰 영향을 끼친다.

그래서 Redis를 어디서 어떻게 배치할 지에 대한 전략을 세워야한다. 이를 캐싱 전략(cache strategies)이라고 한다.

 

읽기 전략(Read Strategies)

 

Look-Aside(Lazy Loading)

 

데이터를 읽는 작업을 할 때 사용되는 전략이며, 레디스를 캐시로 쓸 때 가장 많이 사용한다.

 

먼저 애플리케이션이 데이터를 읽을 때, 캐시를 확인한다.

캐시에 데이터가 존재하면 캐시에서 데이터를 읽어온다.

 

만약, 레디스에 찾는 데이터가 없다면 DB에 접근해서 데이터를 직접 가져와 레디스에 저장한다.

 

따라서, 캐시에는 찾는 데이터가 없을 떄만 데이터가 캐싱되기 때문에 이를 지연 로딩(Lazy Loading)이라고 부른다.

 

 

만약 캐시로 붙어있던 커넥션이 많이 있었다면 그 커넥션이 모두 데이터베이스로 붙기 때문에 DB에 많은 트래픽이 한꺼번에 몰릴 수 있다.

 

이런 경우에는 캐시를 새로 투입하거나 DB에만 새로운 데이터를 저장했다면 캐시에 데이터가 없기 때문에 처음에 cache miss가 지속적으로 발생해서 DB에 성능 저하가 올 수 있다.

 

이럴 때에는 미리 DB에서 캐시로 데이터를 밀어주는 작업을 하는데 이를 cache warning 이라고 한다.

 

 

Read-Through

 

캐시에서만 데이터를 읽어오는 전략(inline cache)이다.

Look-Aside와 비슷하지만 데이터 동기화를 라이브러리 또는 캐시 제공자에게 위임 하는 방식이다.

 

따라서 데이터를 조회하는데 있어서 전체적으로 속도가 느리다.

또한 데이터 조회를 전적으로 캐시에만 의지하므로, redis 가 다운될 경우 서비스 이용에 차질이 생길 수 있다.

 

대신에 캐시와 DB 간의 데이터 동기화가 항상 이루어져 데이터 정합성 문제에 벗어날 수 있다.

 

Read-Through 방식은 cache Store 에 저장하는 주체가 Server 인지, Data Store 인지 에 대한 차이점이 있다.

이 방식은 직접적인 데이터베이스 접근을 최소화 하고 Read 에 대한 소모되는 자원을 최소화 할 수 있다.

 

하지만 캐시에 문제가 발생하면 서비스 전체 중단으로 빠질 수 있기 때문에

Replication 또는 Cluster 로 구성하여 가용성을 높여야 한다.

 

 

쓰기 전략(Read Strategies)

Write- Around

 

DB에 데이터를 저장하고 cache miss가 발생하면 DB에서 데이터를 캐싱한다.

이 경우에는, cache 내의 데이터와 DB 내의 데이터가 다를 수 있다.(데이터 불일치)

캐싱된 데이터가 있을 경우 데이터를 수정할 때 캐싱된 데이터를 수정하지 않고, 캐시에 데이터는 있기 때문에 서로 캐싱을 하지 않는다.

따라서 데이터베이스에 저장된 데이터가 수정, 삭제 될때마다 cache 또한 삭제하거나 변경해야하며, Cache expire를 짧게 조정하는 식으로 대처해야한다.

 

 

Write-Through

 

DB에 데이터를 저장할 때 cache에도 함께 저장하는 방법이다.

cache는 항상 최신 정보를 가지고 있다는 장점이 있지만, 저장할 때마다 두 단계(DB / cache 저장) 를 거쳐야 하기 때문에 상대적으로 느리다.

그리고 재사용되지 않는 데이터도 무조건 캐시에 넣어버리기 때문에 일종의 리소스 낭비를 초래할 수 있다.

이 경우 데이터를 저장할 때 만료시간(Expire-time)을 설정하는 게 좋다.

 

 

Reference

https://www.youtube.com/watch?v=92NizoBL4uA

 

https://inpa.tistory.com/entry/REDIS-%F0%9F%93%9A-%EC%BA%90%EC%8B%9CCache-%EC%84%A4%EA%B3%84-%EC%A0%84%EB%9E%B5-%EC%A7%80%EC%B9%A8-%EC%B4%9D%EC%A0%95%EB%A6%AC#look_aside_%ED%8C%A8%ED%84%B4

 

https://medium.com/garimoo/%EA%B0%9C%EB%B0%9C%EC%9E%90%EB%A5%BC-%EC%9C%84%ED%95%9C-%EB%A0%88%EB%94%94%EC%8A%A4-%ED%8A%9C%ED%86%A0%EB%A6%AC%EC%96%BC-02-f1029893e263

 

https://yoongrammer.tistory.com/101#Read_Through

반응형

'DBMS > Redis' 카테고리의 다른 글

[Redis] 레디스란 무엇인가?  (1) 2023.12.30

댓글