[Django]캐시의 정의와 동작원리

이열음·2022년 1월 31일
0

🌟Django cache

🎯캐시란?

캐시는 프로세서의 속도를 따라가지 못하는 메인메모리를 보완하여
처리속도를 빠르게 개선하기 위한 장치입니다.
위키백과에는 다음과 같이 정의되어있습니다.

"데이터나 값을 미리 복사해서 놓는 임시 장소를 의미한다."
정의된 대로 캐시는 주 메모리 이외에 캐시메모리라는 공간을 의미하며
이 공간에 데이터를 미리 복사해두고 아래와 같은 데이터에 빠르게 접근할 수 있게끔 해줍니다.

1. 자주 접근하게 되는 경우
'자주 접근한다'는 지역성의 원리에 기반하여 판단합니다.
지역성은 시간지역성공간지역성으로 나뉘어집니다.
- 시간지역성
최근 접근한 데이터에 다시 접근하는 경향
- 공간지역성
접근한 데이터 주변에 있는 데이터에 다시 접근하는 경향

2. 값을 다시 계산하여 써야하는데 이 계산시간이 오래 걸리는 경우
또한 캐시는 반응속도 자체가 빠른 SRAM임과 동시에
주소가 키로 주어졌을떄 바로 접근할 수 있는 해시테이블 형식의 하드웨어이므로
접근시간자체도 O(1)정도로 매우 빨라 시스템 성능향상에 큰 역할을 합니다.

🎯캐시의 동작방식

웹서버가 캐시에 접근하는 원리는 다음과 같습니다.

Look aside cache

  1. CPU에서 메모리 가상주소를 사용하여 캐시메모리에 접근한다.
  2. MMU라는 관리장치에서 가상주소를 번역하여 메모리의 물리주소로 변환한다.(데이터 저장방식에 따라 물리주소가 다르게 변환된다.)
  3. 변환한 주소에 찾는 데이터가 있는지 확인한다.
    • if 캐시내에 있다면?
      캐시된 데이터를 보여준다.
    • if 캐시내에 없다면?
      데이터를 가져오고 캐시에 저장한뒤 보여준다.

Write back

  1. CPU에서 사용할 데이터를 캐시에 기록한다.
  2. 사용 후 블록단위로 캐시의 내용을 삭제할 때 메모리에 저장한다.
    해당 방식의 특성상 캐시와 메모리 사이 업데이트 시기가 달라
    데이터가 일치하지않는 inconsisteny가 발생할 수 있습니다.

Write through

  1. CPU에서 사용할 데이터를 캐시와 메모리내에 기록한다.
    inconsistency나 loss가 발생하지 않는다는 장점이 있으나
    메모리 자체가 느리다면 성능저하가 발생합니다.

🎯장고가 지원하는 캐시유형

장고에서 지원하는 기본 캐시 중 가장 빠르고 효율적인 것은 Memcached 입니다.
DB나 API호출 이후 받아오는 결과데이터를 작은단위(청크)의 key-value 형태로 메모리에 저장하는 형식이며 CPU가 처리할 데이터를 임시로 저장하는 RAM에 데이터 및 오브젝트를 캐시함으로써 데이터를 읽는 횟수를 줄이는 방식을 사용합니다.
이를 통해 디스크를 거치지 않으므로 속도가 매우 빠르다는 장점도 있습니다.
Memcached를 사용하면 서버단에서는 부족한 메모리를 충족시키기 더욱 좋아지는데요.

- 기존
하나의 웹서버에서 쓸 수 있는 메모리가 정해져있고,
한 서버당 정해진 크기의 메모리만 사용할 수 있습니다.

- Memcached 도입 후
웹서버에서 쓸 수 있는 메모리들을 논리적으로 결합시켜
각각의 웹서버는 전체 메모리 캐시 크기만큼 사용할 수 있게 됩니다.

이처럼 Memcached를 사용하면 웹서버들이 할당된 메모리가 아닌
전체 캐시 크기만큼 메모리를 사용할 수 있어 부족한 메모리를 쉽게 융통할 수 있습니다.

참고
https://docs.djangoproject.com/en/3.1/topics/cache/
https://testdriven.io/blog/django-caching/#:~:text=Redis%20vs%20Memcached,%2C%20key%2Dvalue%20data%20stores.&text=Redis%2C%20on%20the%20other%20hand,in%20a%20pub%2Fsub%20system.
https://ko.wikipedia.org/wiki/Memcached
http://milooy.github.io/TIL/Django/django-cache.html#%E1%84%8F%E1%85%A2%E1%84%89%E1%85%B5
https://parksb.github.io/article/29.html#:~:text=%F0%9F%92%B5%20%EC%BA%90%EC%8B%9C%EA%B0%80%20%EB%8F%99%EC%9E%91%ED%95%98%EB%8A%94%20%EC%95%84%EC%A3%BC%20%EA%B5%AC%EC%B2%B4%EC%A0%81%EC%9D%B8%20%EC%9B%90%EB%A6%AC,-%ED%95%98%EB%93%9C%EC%9B%A8%EC%96%B4%EB%A1%9C%20%EA%B5%AC%ED%98%84&text=%EA%B8%B0%EC%88%A0%EC%9D%98%20%EB%B0%9C%EC%A0%84%EC%9C%BC%EB%A1%9C%20%ED%94%84%EB%A1%9C%EC%84%B8%EC%84%9C,%EB%B0%94%EB%A1%9C%20%EC%BA%90%EC%8B%9C(Cache)%EB%8B%A4.
http://melonicedlatte.com/computerarchitecture/2019/02/12/203749.html

0개의 댓글