django에서 redis 사용해서 caching 하기

homebrew를 사용하여 설치하는 redis는 서버를 설치하고 시작하는 과정이며,
redis 라이브러리를 사용하는 것은 코드에서 redis 서버와 상호작용 할 수 있는 라이브러리를 설치하는 것이다.
즉, redis 서버가 실행 중이어야 코드가 이를 사용하여 데이터를 저장하거나 검색할 수 있으며,
redis 라이브러리가 설치되어 있어야 코드가 redis 서버와 통신할 수 있다.
homebrew를 사용해서 redis 서버를 설치한다.
1. homebrew 설치
2. brew가 설치되어 있는지 확인 brew --version
3. redis 설치 brew install redis
4. redis가 설치되어 있는지 확인 redis-server --version
5. redis 실행 redis-server
vscode에서 redis 라이브러리 설치
1. redis 설치 pip install django-redis

2. 설치가 되었다면 settings.py에 설정을 해준다.
CACHES = {
"default": {
"BACKEND": "django_redis.cache.RedisCache",
"LOCATION": "redis://127.0.0.1:6379",
"OPTIONS": {
"CLIENT_CLASS": "django_redis.client.DefaultClient",
}
}
}
3. 캐싱 기능을 사용할 앱의 views.py에 redis에 import 해준다.
from django.core.cache import cache
캐시 사용하는 방법 간단 예시
cache.clear() : 모든 캐시를 지운다.
cache.deleta(key) : key를 가진 캐시 항목 삭제
cache.get(key) : key를 가진 캐시 항목을 가져온다.
cache.set(key, value, timeout) : key로 캐시 항목을 설정한다.
from django.core.cache import cache
from ex.models import DataModel
def get_data():
# 캐시에서 데이터를 찾는다.
data = cache.get('my_data')
if not data:
# 캐시에 데이터가 없으면 db에서 가져온다.
data = DataModel.objects.all()
# 데이터를 캐시에 저장 (60초 동안 유지)
cache.set('my_data', data, timeout=60)
return data
코드에 적용
캐시에서 토큰을 가져온 후 캐시에 토큰이 존재하지 않으면 새 토큰을 요청하고,
요청한 토큰을 캐시에 저장한 후 반환하며, 캐시에 토큰을 저장할 때 30분 후 만료된다.
# 토큰 발급
def get_access_token(request):
# 'spotify_access_token' key값으로 value를 가져온다.
access_token = cache.get('spotify_access_token')
if access_token is None: # 캐시 안에 토큰이 존재하지 않으면 아래의 로직 진행
encoded = base64.b64encode(f"{CLIENT_ID}:{CLIENT_SECRET}".encode("utf-8"))
headers = {
'Authorization': f'Basic {encoded.decode("utf-8")}',
"Content-Type": "application/x-www-form-urlencoded"
}
data = {
"grant_type": "client_credentials",
}
response = requests.post(TOKEN_URL, headers=headers, data=data)
response_data = response.json()
access_token = response_data.get('access_token')
expires_in = 10
cache.set('spotify_access_token', access_token, timeout=expires_in)
# return access_token
return JsonResponse({'access_token': access_token})




