장고 캐시

장고에 캐시 기능을 모르고 있었다가 우연치않게 알게 되었다. 그동안 블렉스의 모든 주제를 호출할때 정말 많은 DB 호출이 필요해서 어떻게 개선해야하나 고민하고 있었는데 캐시를 사용해서 해결할 수 있었다. 아래는 필자의 상황에 맞게 구성된 코드지만 충분히 이해하고 응용가능 할 것이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
from django.core.cache import cache

def topics(request):
    cache_key = 'main_page_topics' # 유니크한 키 값을 사용하면 된다
    tags = cache.get(cache_key)
    if not tags:
        tags = sorted(get_clean_all_tags(), key=lambda instance:instance['count'], reverse=True) # 캐시가 없을때 수행할 명령
        cache_time = 86400 # 초 단위로 입력하면 된다
        cache.set(cache_key, tags, cache_time)
        print('cache not hit')
    else:
        print('cache hit')
    return JsonResponse({'tags': tags}, json_dumps_params = {'ensure_ascii': True})


속도비교

최초에 사용자가 접근했을 경우 캐시된 데이터가 없으므로 아래 로그가 출력된다.

1
cache not hit


이후 접근에서는 아래 로그가 출력된다.

1
cache hit

사진을 보다시피 2배 가량이 빨라진 것을 확인할 수 있다. 현재는 주제가 몇 개 되지않는 점을 감안하면 심각하게 성능을 갉아먹고 있다는 것을 증명하는 것이며 차후에는 더 극한으로 치닫을 것이다. 다만 캐시에 시간을 지정한 동안은 데이터가 변경되도 적용되지 않는다는 것을 꼭 감안하고 사용해야 한다. DB의 부하는 일으키지만 자주 변하지 않거나 너무 자주 호출되는 부분에 캐시를 적용하는게 좋겠다.


캐시 라이브러리

장고에선 기본적으로 LocMemCache를 사용하고 있다. 다른 시스템으로는 MemcachedCache와 Redis가 있으며(그 외 다양한 시스템이 많다. 캐시 DB를 만드는 것도 있다.) 해당 라이브러리의 경우에는 프로세스간 캐시를 공유할 수 있는 등 대규모 환경에선 라이브러리를 사용하는 것이 적합해 보인다.


참고

장고 공식 문서 - Cache를 참고하면 더 다양한 정보를 얻을 수 있다. 해당 문서에선 Settings.py를 먼저 설정하는 것을 보여주는데 앞서 언급했듯 기본적으로 LocMemCache가 사용되어 등록하지 않아도 사용 가능하다. 다른 라이브러리를 적용할 것이라면 설치후 문서처럼 BACKEND에 등록 후 사용해야 한다.

WRITTEN BY

배진오

소비적인 일보단 생산적인 일을 추구하며, 좋아하는 일을 잘하고 싶어합니다 :D
im@baejino.com