Django

[Redis/Memcached]Cache 란? django settings.py에 Cache 설정하는 법(Redis 영업 글)

a-몬드 2022. 5. 27. 11:41
반응형

사족

더보기

프로젝트를 진행하면서 redis와 django ORM에 대해 공부하였었다. 

공부하면서 든 의문 중에 하나가 DB에서 가져온 데이터를 캐시에 저장하여 다시 쓴다는 말을 들었었다. 

캐시에 대한 의문이 생겼고 그렇게 저장한 캐시를 어디에 저장해 놓고 서버 접근하지 않고 캐시에서 바로 빼오는 것을 아는 건가 하는 의문이 생겨서 공부하고 조사해서 정리해놓은 글이다. 

 

우선 하드웨어에서 cache를 어떤식으로 사용하는지 알아보자

Cache Memory 란?

  • 하드디스크와 CPU간의 데이터 속도 향상을 위한 중간 버퍼 역할을 하는 CPU 내, 외에 존재하는 메모리 
  • CPU는 빠르게 일을 진행하고 있는데, 메모리에서 데이터를 가져오는 게 느려 중간에 미리 CPU에 전달될 데이터를 들고 서있는 형태
  • 전체 시스템의 성능을 개선 시킬 수 있다.

 

성능 개선에 대해 예를 들어서 설명해보겠다.

 

나는 서재에 수 많은 책을 보관하고 있다. 요리를 할 때마다 자주 요리책을 본다. 서재에 수많은 책이 있는 책장에서 요리책을 찾아서 쓴다고 생각해보자. 주방에서 서재까지 들어가 책장에서 요리책을 찾고 주방으로 책을 가져와서 요리를 하게 될 것이다. 동선을 생각해보면 매우 비효율적이다. 

이때 캐시라는 개념을 도입한다면 자주 보는 요리책만 따로 주방 식탁 위에 올려놓는 것.

요리 할 때마다 서재에 가는 것이 아닌 주방 식탁에서 바로 책을 펼쳐서 볼 수 있는 것이다. 

하지만 주방 식탁 위에는 서재처럼 많은 책을 보관할 수도 없고 집에 다른 사람이 식탁 위에 있는 책이 방치되었다고 생각하면 다시 서재에 가져다 놓을 수도 있다. 캐시의 개념과 매우 비슷한 예시이다.  

 

Cache 란?

  • 자주 사용하는 데이터나 값을 미리 복사해 놓는 임시 장소
  • 저장 공간이 작고 비용이 비싼 대신(상대적으로) 빠른 성능을 제공
  • 반복적으로 데이터를 불러오는 경우, 지속적으로 DBMS or Server에 요청하는 것이 아니라 Memory에 데이터를 저장했다가 쓰는 것 
  • Enterprise급 Application에서는 DBMS의 부하를 줄이고, 성능을 높이기 위해 캐시를 사용
  • Cache Hit : 캐시에 요청되고 해당 데이터가 존재하면 Hit
  • Cache Miss : 캐시에 요청 되고 데이터가 존재하지 않으면 Miss

 

Long Tail 법칙

  • 20%의 요구가 시스템 리소스의 대부분을 사용한다는 법칙
  • 20%의 기능에 Cache를 사용하여 리소스 사용량을 줄이고, 성능은 향상 

 

 

 

Local Cache VS Global Cache

 

Local Cache

  • Local장비 내에서 사용되는 캐시, Local장비의 Resource를 이용한다.(Memory, disk)
  • Local에서만 작동하기 때문에 속도가 빠르다.
  • 다른 서버와 데이터 공유가 어렵다.

 

Global Cache

  • 여러 서버에서 Cache Server에 접근하여 사용하는 캐시, 분산된 서버에서 데이터를 저장하고 조회
  • 네트워크를 통해 데이터를 가져오므로, Local Cache에 비해 상대적으로 느림(네트워크 트래픽)
  • 별도의 Cache서버를 이용하기 때문에 서버 간의 데이터 공유가 쉽다.

 

Global Cache와 비슷한 CDN에 대해 조금 조사해본 것

더보기

CDN

콘텐츠를 딜리버리 해주는 서버

😁장점

  • 데이터를 고속으로 엑세스 할 수 있다는 장점
  • 자주 쓰는 파일들을 가까운 지역의 서버에 올려 놓는다.
  • 가까운 지역의 서버가 좋은 이유 : 아주 먼곳에 있는 파일을 매번 가져와야 한다면 네트워크 구간이 멀어서 실패율도 있고, 전송 속도가 느리고, 오래 걸릴 수 있다.
  • 캐시라는 개념은 동일, 컴퓨터 내부나 웹서버와 클라이언트 사이, 네트워크에서 파일을 전송시도 등 다양하게 사용이 가능

 

🙄단점

  • 캐시메모리의 특성이지만 지워질 수 있다는 것을 전제로 해야한다.
  • 캐시는 되도록 빈도수가 높은 것들 위주로 데이터량이 많지 않는 것이 좋다.
  • 캐시가 붙은 장치는 비싸다. 상대적으로 그래서 모든 데이터를 넣을 생각은 말아야 한다.

 

Django의 Cache Framework

핵심 목표 

  • Less Code : 캐시는 빨라야 한다. 캐시에 관련된 프레임워크 코드 작업은 최소한으로 유지
  • 일관성 : 캐시 API는 일관된 인터페이스를 제공
  • 확장성 : 캐시 API는 개발자의 필요에 따라 Application에서 확장할 수 있다.

 

Django에서 Cache settings.py 설정법

Memcached

  • 메모리 기반 서버
  • Danga Interactive에서 오픈소스로 제공 
  • 페이스북, 위키피디아 같은 사이트에서 데이터베이스 액세스를 줄이고 사이트 성능을 크게 향상
  • 데몬으로 실행되며 지정된 양의 RAM이 할당
  • 캐시에서 데이터 추가, 검색 및 삭제하기 위해 빠른 인터페이스 제공
  • 모든 데이터는 메모리에 직접 저장되므로 데이터베이스나 파일 시스템 사용에 따른 오버헤드가 없다.
  • Memcached자체를 설치 후 Memcached바인딩 설치
  • django에서 지원하는 바인딩은 pylibmc와 pymemcache 두 가지

 

(기다려보세요,,, Redis 쓰셔야 하니까,,, 혹시 사정상 Memcached 사용하실 분들을 위해 작성합니다.)

 

아래 settings.py예시

 

pymemcache 바인딩을 사용하고 주소는 localhost(127.0.0.1) 포트는 11211 사용할 때

로컬 소켓 파일 /tmp/memcached.sock를 통해 pymemcache 바인딩을 사용할 때

 

다수의 서버에서 캐시를 공유할 때

두 개의 240,242 IP주소 Memcached인스턴스를 공유할 때 Location 설정 추가

포트 번호 달라도 된다. 

Redis

  • 캐싱에 사용할 수 있는 인메모리 데이터베이스(아래 접기 참고)
  • 시작하려면 로컬 또는 원격 시스템에서 Redis 서버가 필요
  • Redis용 Python 바인딩을 설치 redis-py는 Django에서 기본으로 지원하는 바인딩인 메모리 
더보기
인메모리 데이터베이스 : 외부 저장 장치에 데이터를 저장하지 않고 메모리에서 데이터를 읽고 쓴다.

 

Redis를 캐시 백엔드로 사용하려면 아래 예시

 

localhost(127.0.0.1) 포트 6379

여러 개의 서버에서 사용

 

Redis VS Memcached

  • Redis는 Memcached보다 더 강력하고 대중적이고 잘 지원된다. 
  • Memcached는 Redis가 수행할 수 있는 작업 중 극히 일부만 수행할 수 있다.
  • Redis랑 기능이 겹치는 경우에도 Redis가 더 좋다.

스택 오버 플로 글을 참고하였는데 거의 redis 영업 직원이 쓴 글 같다,,,,나도 영업당했다,,,

유명한 게 괜히 유명하겠냐고~ 좋으니까 유명하겠지,,,

 

 

아래에 자세한 예시

 

  • I/O 속도 : 둘 다 빠름. 벤치마크는 워크로드, 버전 및 기타 여러 요인에 따라 다르지만 일반적으로 redis가 memcached만큼 빠르거나 더 빠르다.
  • 메모리 사용량 : redis가 더 좋다.

    - redis : 최대 크기 설정은 사용자가 할 수 있다. 그리고 자주 사용하지 않는 메모리를 다시 제공

    - memcached : 캐시 크기를 지정하고 항목을 추가하고 나면 데몬의 크기보다 약간 커진다.

                             memcached를 다시 시작하지 않는 이상 해당 공간을 회수할 방법이 없다.

  • Disk I/O dumping : redis가 훨씬 더 좋다. memcached는 도구 없이 disk dumping 할 수 있는 방법이 없다.
  • Scaling : 단일 인스턴스 보다 더 캐시가 필요하기 전에 둘 다 공간을 많이 준다.

 

redis 문서에 있는 자기들 자랑

  • Redis는 memcached보다 문서화되어 있습니다. 주관적이라고 생각했지만 점점 더 사실에 가까워져 간다.
  • redis.io로 쉽게 탐색할 수 있는 환상적인 리소스
  • 브라우저에서 redis를 테스트해볼 수 있고 각 명령에 대한 실시간 예제도 제공
  • memcached보다 redis의 스택 오버플로 결과, Google 검색 결과가 2배, 더 많은 언어로 쉽게 액세스 할 수 있는 예제도 있고, 적극적인 개발 중이다.
  • redis에 대한 지원 및 문서가 훨씬 더 많고 최신상태이다.

이 정도면 redis 쓰는 게 맞지 않을까 싶다.ㅎㅎ 저렇게 강력하게 어필하는 자는 진정성이 느껴진다. 

그래 redis 너네 최고다!!

 

여러분 redis 쓰세요.

 

 

 

 

 

출처 

 

 

redis와 memcached 비교 https://stackoverflow.com/questions/10558465/memcached-vs-redis

django 공식문서  https://docs.djangoproject.com/en/4.0/topics/cache/

https://jaehun2841.github.io/2018/11/07/2018-10-03-spring-ehcache/#Spring-Cache-Annotation

반응형