[TIL] # 40 Redis

데이터를 주고받는데 있어 시간적인 부분은 중요한 부분이라고 생각하고
장고에서는 JOIN을 이용해서 미리 캐싱해서 DB에 접근하는 횟수를 줄여준다

하지만 select_related 와 prefetch_related 두가지로는 부족한 부분이 있어

메인으로 사용하는 DB이외에도 NOSQL을 이용하여 주고받는 데이터를
캐싱해서 DB에 접근하는 방식이 아닌 메모리에서 데이터를 가지고 오는 방식을 통해
효율적으로 데이터를 주고 받을 수 있게 된다

Redis

MONGO DB 라는 NOSQL은 들어 봤지만
Redis는 처음듣는 단어라 생소했다

우선 실험을 해보기 위해서

brew install redis

레디스를 설치해주고 레디스를 실행시켜줫다

처음 써보는 NOSQL이라 어떻게 달라질지 감이 안잡혔다 🥲

우선 원래 있던 데이터에 django-seed를 사용하여
원래 있던 데이터 총 3000개 정도의 데이터를 만들어 주었고

실험을 하기 위해서 loadtest를 이용했습니다

loadtest -n 10 http://127.0.0.1:8000/spaces

총 500번의 요청을 보냈고 결과는

20초 정도 걸렸다
1초에 24개의 request를 처리한걸 확인할 수 있었다

500명의 사람이 들어오면 20초나 걸리는건가? 생각이 들었고
순수하게 mysql하나의 DB로는 500명도 벅차겠구나 생각했다

Redis 사용후

와... 대박 ㅋㅋㅋㅋ 좀 놀랐다
우선 결과를 보면 속도는 반이상 줄어들었고, 1초당 해결하는 request도
눈에띄게 늘어났다

Redis를 사용하여 캐싱하고 데이터를 가지고 오게 되면 이렇게까지 되는구나 싶었고,

Redis 사용하기

from django.core.cache import cache

class SpaceView(View):
    def get(self, post):
        context = cache.get('spaces')
        if not context:
            spaces = Space.objects.values("id", "name")
            context = {}
            for i in spaces:
                context[f'space_{i["id"]}'] = i
            cache.set('spaces', context)
        return JsonResponse(context)

우선 첫 테스트를 위해 이렇게 뷰를 짯고

redis에 cache된 데이터가 있다면 가지고 오고 없다면
cache.set을 이용하여 spaces라는 키에 context를 넣어주는 방식이다

cache.set(키, 값, 만료시간)

만료시간을 정해줄 수 있고, 정해주지 않는다면 영구적으로 저장된다

redis말고도 좋은 방법이 많지 않을까 생각한다

진짜 ㅋㅋㅋㅋ 어마어마한것 같다
왜 뭔가 알아보면 공부할게 더 생길까??

개발자 세계는 너무 신기한 세계인 것같다

Django View 코드를 작성할때 redis를 한번 활용해봐야겠다

좋은 웹페이지 즐겨찾기