탕구리's 블로그

레디스, 캐시의 사용(feat. Toast Meetup) 본문

Server

레디스, 캐시의 사용(feat. Toast Meetup)

탕구리당 2020. 3. 8. 16:34
반응형

이 글은 토스트 밋업에 올라온 "개발자를 위한 레디스 튜토리얼02"의 내용을 정리한 글입니다.

 

레디스 캐시로서 사용하기

레디스를 캐시로 사용하는데 있어서 다양한 캐싱전략이 사용됩니다. 캐싱 전략은 캐싱되는 데이터의 유형과 데이터에 대한 엑세스 패턴ㄴ에 따라 달라지기 떄문에, 서비스 환경에 따라서 적절한 캐싱 전략을 사용해야합니다.

 

Look Aside(=Lazy Loading)

Look Aside 방식은 캐시서버를 옆에 두고 필요할 때만 데이터를 캐시에서 로드하는 캐싱 전략입니다.

 

요청의 흐름은 다음과 같습니다.

 

1. 캐시에 데이터가 있는지 먼저 확인합니다.

2-1. 캐시에 데이터가 있는 경우(cache hit) 해당 데이터를 사용합니다.

2-(2). 캐시에 데이터가 없는 경우(cache miss) 데이터베이스에서 데이터를 가져옵니다.

3.  2-(2)에서 가져온 데이터를 캐시에 저장합니다.

 

Lazy Aside의 특징은 "실제로 사용되는 데이터만 캐시한다", "레디스의 장애가 어플리케이셔에 치명적인 영향을 주지 않는다" 입니다.

하지만 캐시 미스가 발생한 경우 데이터 쿼리에 대한 시간이 오래 걸리거나, 최신 데이터로의 동기화 문제가 생길 수 있습니다.

 

Write Through

 

Write Through 방식은 데이터에 대하 CUD 작업이 일어나는 경우 캐시와 데이터베이스 모두에 갱신 작업을 하는 방식입니다.

해당 작업이 일어나는 경우 쓰기 시간이 증가(캐시와 데이터베이스 모두 작업)하기 때문에 지연이 발생할 수 있습니다.

모든 데이터가 캐시에 저장되기 때문에 불필요한 데이터의 제거를 위해 TTL을 설정하여 사용하면 효과를 볼 수 있습니다.

 

 

레디스의 Set을 통해 좋아요 구현하기

좋아요에 대한 구현은 하나의 댓글에 한번의 좋아요를 제한하는 것이다. 기본적으로 RDBMS의 unique 조건을 생성하여 처리할 수 있습니다. 하지만 데이터의 입력량이 많은 경우 RDBMS에 대한 성능 저하가 발생할 수 있습니다. 좋아요 기능에 대한 전제조건을 만족시키 위해서 레디스의 Set을 통해 간단한 구현이 가능합니다. 레디스의 set 자료 구조는 순서가 없고, 중복을 허용하지 않는 집합입니다.

게시물에 대한 ID를 Key로 사용하고 사용자의 ID를 value로 사용하는 경우 중복되는 값이 들어갈 수 없기 때문에 손쉽게 좋아요 기능을 구현할 수 있습니다.

 

 

게임 서비스에서 일일 순 방문자수 구하기

일일 방문자를 구하기 위한 방법은 대표적으로 세가지가 있다.

1. Access Log를 분석하기

2. 외부 지표 서비스(ex. google analytics)를 이용하기

3. 접속 정보를 로그파일로 작성하여 배치 프로그램 돌리기

 

레디스를 통해 일일 방문자수를 구해보자, 사용자의 ID는 0부터 순차적으로 증가된다고 가정합니다. String의 각 bit를 하나의 사용자로 생각하는 경우 bit의 위치는 사용자의 ID로 생각할 수 있습니다. 하나의 bit는 하나의 사용자를 나타내므로 레디스 String의 최대 길이는 512mb이므로 충분한 사용자를 나타낼 수 있습니다.

 

사용자가 방문한 경우 사용자의 ID에 위치하는 인덱스의 bit의 값은 1로 변경하고, BITCOUNT 명령어를 통해 그날 접속한 사용자의 수를 구할 수 있습니다. 또한, 레디스에서는 BITOP 명령어를 통해 다양한 비트연산이 가능하며 특정 조건에 맞는 다양한 결과를 도출할 수 있습니다.

 

최근 검색 목록 표시하기 

최근 검색 기록에 대한 내용을 데이터베이스에 저장하여 활용하려면 검색 개수의 관리나, 오래된 데이터를 정리하는 등 추가적으로 관리해줘야 하는 부부이 많아집니다. 레디스의 sorted set을 이용한다면 데이터를 간단하게 정렬하여 저장하고 관리하는 방법이 가능합니다.

그림과 같이 검색한 시간을 정렬 기준으로 잡고 그 기준에 따라 데이터를 저장하게 합니다. 하지만 검색 기록에 대한 개수를 제한하기 위해서는 항상 개수를 확인하고 제한을 초과하는 경우 삭제하는 작업을 진행해야 합니다.

 

하지만, 제한된 개수에 도달하지 않은 경우 이전 검색 기록을 삭제해서는 안된다. 이런 경우 sortedset의 음수 index를 활용하면 간단합니다. sortedset 음수 인덱스란 인덱스의 값이 가장 작은 음수부터 차례대로 매겨집니다.

 

예를 들어 총 데이터의 개수가 10개라고 가정하면 검색 시간순으로 sorted를 하여 저장한 경우 가장 오래된 데이터는 -10의 음수 인덱스를 갖습니다. 데이터에 멤버를 추가한 후 제한된 개수+1의 음수 인덱스를 지운다면 특정 개수 이상의 데이터가 저장되는 것을 방지할 수 있습니다.

 

 

 

 

반응형
Comments