Today I Learned/django

장고 (django) 캐시 사용하기 (memcached)

하나719 2023. 8. 31. 15:13
반응형

이전글 참고: 2023.08.30 - 메모리 계층 구조와 In-Memory DB (Redis) 특징

 

메모리 계층 구조와 In-Memory DB (Redis) 특징

데이터역량 키우는 하루하루의 기록

hanawithdata.tistory.com

캐시에 대해서 궁금하다면 위 글을 참고해보고 오는것을 추천합니다.

 

캐시 사용하는 이유

웹페이지를 동적으로 구성하면, 실시간으로 database에서 값을 불러오고 계산해야하는 경우가 있는데 트래픽이 많은 웹사이트같은 경우 처리비용이 많이 듭니다. 이때 자주 사용되는 계산 값은 db에 가지 않고 빠르게 불러오기 위해 캐시에 저장해두고 사용하면 응답속도나 비용을 효율화 할 수 있습니다. 

 

장고에서 HTTP요청시  캐시 프레임워크가 동작하는 순서

1. 캐시에서 요청된 데이터를 찾습니다.

2. 캐시에 있는 경우 반환합니다.

3. 캐시에 없는 경우  데이터베이스에서 반환합니다.

4. 캐시에 값을 설정해줍니다.

5. 다음에 같은 값을 불러오면 캐시에서 반환해줍니다. 

 

 

memcached 사용하기 

장고에서 사용할 수 있는 캐시 백엔드로는 memcached, redis , database, filebased 등이 있는데, memcached로 연습해보겠습니다. 

 

1. memcached 설치하기

도커 실행 후, 명령어를 통해 설치해줍니다.

docker pull memcached

이렇게 하면 Memcached Docker 이미지가 로컬 컴퓨터에 다운로드됩니다.

 

2. memcached docker 컨테이너 실행하기

docker run -it --rm --name memcached -p 11211:11211 memcached -m 64

memcached는 기본적으로 11211 포트에서 실행됩니다.

 

3. memcached python 바인딩 설치하기

파이썬에서 Memcached 서버와 상호 작용하기 위한 라이브러리입니다.

pip install pymemcache==3.5.2

4. 장고에 cache 설정 

settings.py 에 추가

CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.memcached.PyMemcacheCache',
'LOCATION': '127.0.0.1:11211',}
}

5. 낮은 수준 캐시 사용하기

장고에서 템플릿, 뷰, 사이트 까지 캐시가 가능한데 특정 쿼리를 세밀하게 계산하여 캐시할 수 있습니다. 

views.py 파일 수정

 

<변경 전>

subjects 에 쿼리셋을 통한 count 값을 계산해서 저장 

class CourseListView(View):

	.....

    def get(self, request, slug=None):
        subjects = Subject.objects.annotate(total_courses=Count('courses'))
        courses = Course.objects.annotate(total_modules=Count('modules'))

<변경 후>

subjects 값이 없는 경우, db에서 쿼리셋으로 1차 계산 해주고 이를 캐시에 세팅해줍니다.

이 후에는 매번 db에서 계산할 필요 없이 설정해준 캐시 값에서 불러와줍니다. 

from django.core.cache import cache

class CourseListView( View):

	...

    def get(self, request, slug=None):
        #subjects = Subject.objects.annotate(total_courses=Count('courses'))
        #캐시로 변경
        subjects = cache.get('all_subjects')
        #캐시에 없는 경우 db에서 설정해주고, 캐시설정해줌
        if not subjects:
            subjects = Subject.objects.annotate(total_courses=Count('courses'))
            cache.set('all_subjects',subjects)
        courses = Course.objects.annotate(total_modules=Count('modules'))

debug toolbar로 캐시요청 확인하기

1. django debug toolbar 설치

pip install django-debug-toolbar==3.6.0

2. settings.py 설정해주기

1) installed_app에 추가

INSTALLED_APPS = [
# ...
'debug_toolbar'
,

]

2) middelware 상단에 추가

MIDDLEWARE = [
'debug_toolbar.middleware.DebugToolbarMiddleware',
....
]

3) 툴바 띄워줄 내부 ip 설정 -> 외부에서 접근시에는 툴바 노출되지 않음 

INTERNAL_IPS = [
'127.0.0.1',
]

3. main urls.py에 경로 추가

path('__debug__/', include('debug_toolbar.urls')),

4. 서버 실행 후 툴바 열기

http://127.0.0.1:8000/ 

실행 후 우측 툴바에서 cache 열기

반응형