⏱ django + redis

may_soouu·2021년 4월 7일
3

django + redis 조합으로 쿼리 성능 향상 시키기!

🖥 mac 기준 🖥

1. redis 설치

터미널에서 

$ brew install redis

위의 명령어로 redis 설치하기

2. redis 셋팅

설치 후

$ cd /usr/local/etc

위의 경로에 들어가서

$ vi redis.conf

파일 열기

3. 비밀번호와 외부 접속 설정

requirepass foobared
라고 되어 있는 부분 찾아서

requirepass 내가 설정하려는 비밀번호로
ex. requirepass abcde

-------------------------------------

bind 127.0.0.1 로 되어 있는 부분 찾아서

bind 0.0.0.0 으로 수정해주기

:wq!   <- 명령어로 파일 저장 후 나오기

4. 레디스 실행해보기

$ redis-server

위의 그림처럼 나오면 성공!

터미널 하나 더 키고,

$ redis-cli 

입력하면 아래와 같이 나온다.


레디스 키에 저장된 값이 없어서 조회해보면 empty array로 나온다.

5. django 세팅

# project파일/settings.py

CACHES = {
    "default": {
        "BACKEND": "django_redis.cache.RedisCache",
        "LOCATION": "redis://127.0.0.1:6379",
        "OPTIONS": {
            "CLIENT_CLASS": "django_redis.client.DefaultClient",
        }
    }
}

위의 내용 넣어주기

6. views 테스트

# 앱/views.py

import redis
from django.core.cache import cache

class ServiceType(APIView):
    def get(self,request):
        types = request.GET.get("type", None)

        start = time.time()
        
        today = datetime.datetime.now().date()
        if types == 'E' or types == 'N':
        
            get_redis = cache.get('test')
            
            if not get_redis:
            
                eventlist = Event.objects.filter( type=types)
                contentslist = []
                for contents in eventlist:
                    if contents.active == 'Y':
                        if types == 'E':
                            if contents.end_date > today:
                                badge = f'{contents.end_date.month}/{contents.end_date.day}까지'
                            else:
                                badge  = '종료'
                        
                        elif types == 'N':
                            badge = contents.badge
                    
                        contentslist.append ( {
                            'id' : str(contents.id),
                            'title' : contents.title,
                            'badge' : badge,
                            'startDate' : contents.start_date
                        } )

                data = {
                    'contentsList' : contentslist
                }

                cache.set('test', data)
                
                end = time.time()
                print('레디스에 키 없을 때 조회 시간 : ', end-start)

                return BaseResponse(resultcode=int('00'), data=data, status=200)
            
            end = time.time()
            print('레디스에 키 있을 때 조회 시간 : ', end-start)
            return BaseResponse(resultcode=int('00'), data=get_redis, status=200)
            
        return BaseResponse(resultcode=int('01'), status=400)

9번째 & 10번째 줄에

get_redis = cache.get('event4')
if not get_redis:

를 추가해서, 레디스에 내가 저장해 놓은 키값이 있는지 찾은 후 (get 이 조회하는 명령어)
있다면 get_redis 그대로 return
없다면, DB에서 조회 후, 해당 키 값으로 레디스에 저장하기 (set이 저장)

6-1. 레디스에 저장 안 됐을 때

레디스에 키가 없는 상태기 때문에 데이터 조회하는 코드로 데이터 조회 후, 레디스에 키 저장한 후, 데이터 리턴

redis-cli 에서 keys * 로 조회해보면 위의 실행으로 키가 저장된 걸 알 수 있다.

그리고 다시 조회 해보면,

레디스에 저장된 키 값으로 데이터를 찾아서 리턴하면서 시간이 단축된 걸 알 수 있다.

profile
back-end 개발자

0개의 댓글