[Redis] Redis 왜 필요하고 어디에 쓰나

Redis as Cache

API 캐싱만을 원한다면 apicache도 좋다. 래디스보다 훨씬 깔끔하게 캐싱을 이용할 수 있다.


캐싱?

캐싱은 자주 사용되는 데이터의 복제본을 저장해둠으로써 어플리케이션 응답 속도를 향상시킨다. Im-memory 캐싱은 데이터를 속도가 느린 디스크에 저장하지 않고 훨씬 빠른 메모리에 저장함으로써 응답이 훠~~씬 빨라진다.

캐싱에는

  • CDN
  • Database Caching
  • API Caching

등 여러 종류가 있고 알게모르게 대부분의 소프트웨어에서는 캐싱이 쓰이고 있다는 점은 알고하고 넘어가자.

왜 필요한가

같은 데이터를 여러명이 요청한다. 그숫자가 계속 늘어난다. 그런데도 그들이 요청하는 데이터는 계속 같다. 캐시가 없다면 같은 데이터를 반환하는데도 API의 코드들을 모두 거쳐야하고, 데이터베이스까지 들렀다오는 일을 요청수만큼 하게 된다. 반면에 반환값이 같고 자주 요청되는 데이터를 캐싱해둔다면 API의 코드를 거치고 데이터베이스를 들렀다오는 일을 요청된 수만큼 하지 않아도 된다. 요청수가 기존에서 1/1000 1/1000000로도 줄어들수 있게 된다.

언제 캐싱하면 좋은가

데이터페이스 속도 향상

데이터베이스는 어차피 느리긴하지만 row가 많아질수록 더더욱 느려진다. 유저들이 검색하는 데이터는 비슷한 것이 대부분의 트레픽을 차지한다. 그 비슷한 것들의 DB쿼리 결과를 캐시해둔다면 서비스의 전반적인 데이터 전달 속도가 빨라진다.

트레픽이 몰리는 곳들에 캐싱하여 성능 향상:

갑작스런 트레픽 증가가 발생하는 곳에 여러방법으로 캐시를 둘수 있다. 많은 이용자가 조회하는 데이터를 캐싱하는 것은 당연하고, 어떨때는 크게 중요하지 않은 팔로우수, 조회수와 같은 동적 데이터들을 매번 조회하거나, 매번 +,- 실행하지 않고 write caching으로 모아서 한번에 DB를 수정하는 것도 꽤 큰 도움이 될수 있다.

세션 스토어

로그인한 유저에 대한 정보를 매번 검색으로 가져오거나, 로그인한 유저 데이터가 필요한 API들에 대한 요청에 대해 모두 DB에 쿼리하게 된다면 당연히 많은 부하를 주게 된다. 새션에 저장하게 되면 memory만을 들렀다오게 되므로 속도도 훨씬 빠르고 DB에 가는 부하도 줄어든다.

더 깊은 설명은 redislabs에서 제공해준다. Session Management by redislab

게임

게임에선 데이터가 실시간으로 관리되어야하기 때문에 당연히 수많은 데이터를 메모리에 저장하게 된다. 게임뿐만 아니라 게임의 스코어보드 또한 캐싱되어있을 것이다. 예로 네이버의 스코어 보드가 그렇다.

score board

스코어보드는 빠르게 변하기 때문에, 그리고 많은 유저가 보기 때문에 무조건 캐싱을 이용해야한다.

웹 페이지 캐싱

웹페이지에서 수많은 사용자가 접근하는 페이지에대해서는 화면 전체를 캐싱해둘수도 있고, 부분적으로라도 캐싱하여 조금이라도 더 빨리 제공할수 있게된다.

baskcetball

네이버 스포츠를 자주 들어가는 사람은 알것이다. 축구를 들어가든 농구를 들어가든 어느정도의 시간동안 최소 30분정도는 같은 데이터가 보여진다(스코어보드를 제외하고는) 이런 데이터는 당연히 캐싱되어야 한다.

빠른 접근이 필요한 데이터

캐시가 자주 이용되는 데이터에 주로 이용되는게 맞고 그것이 대부분의 이용하는 이유이지만 종종 상황에 따라 빠른 접근이 필요한 데이터를 미리 캐싱해두오 사용하기도 한다.


간단한 질문들

Q. 세션을 굳이 레디스로 써야하나? 그냥 로컬 메모리로 직접 이용하는 것보다 뭐가 좋지?

  1. (제일 중요) 서버가 한대만 돌아간다면 로컬메모리를 직접 써도 무방하다. 하지만 실서비스의 서버를 하나의 인스턴스로 돌리는건 불가능하다.(토이플젝이라면 몰라도) 당연히 여러대의 서버가 로드밸런서에 의해 요청이 분산되어진다. 로그인했던 유저의 정보가 매번 같은 인스턴스로 요청이 갈수 없기때문에 인스턴스간의 새션 정보를 공유할 수 있는 Redis와 같은 것들이 필요하게 된다.

  2. 레디스의 메모리 관리가 JS의 메모리 관리보다 훨씬 더 정교하고 효율적이다.

  3. 여러 종류의 자료구조를 제공하고 여러 편의기능들을 제공해준다.(pub/sub, atomicity 등)

  4. master/slave 구조로 복제본을 만들기 쉽다.

Q. 캐시는 어디에 어떤걸로 두지? “Resis on EC2” VS “AWS Elasticache”

토이 프로젝트에서만 서버가 올라가있는 instance에 Redis를 설치하여 이용하고,
프로덕션에서는 AWS Elasticache를 이용하자. (내 개인적인 선호가 DB는 관리형 서비스를 이용하는 것이다.)

관리형 서비스를 이용하는게 확장하기도 쉽고 모든게 편하다.

다음 편은 캐싱의 구조들을 알아볼 예정이다.

References