Redis는 빠른 오픈 소스 인 메모리 키 값 데이터 구조 스토어입니다. Redis는 다양한 인 메모리 데이터 구조 집합을 제공하므로 다양한 사용자 정의 애플리케이션을 손쉽게 생성할 수 있습니다. 주요 Redis 사용 사례로는 캐싱, 세션 관리, pub/sub 및 순위표를 들 수 있습니다. Redis는 현재 가장 인기 있는 키 값 스토어로서, BSD 라이선스가 있고, 최적화된 C 코드로 작성되었으며, 다양한 개발 언어를 지원합니다. Redis는 REmote DIctionary Server의 약어입니다.
Redis는 속도가 빠르고 사용이 간편하여 최고의 성능이 필요한 웹, 모바일, 게임, 광고 기술 및 IoT 애플리케이션에서 널리 사용되고 있습니다. AWS는 Redis용 Amazon ElastiCache라는 최적화된 완전관리형 데이터베이스 서비스를 통해 Redis를 지원하며, 고객은 원하는 경우 AWS EC2에서 자체 관리형 Redis를 실행할 수도 있습니다.
실제 DB서 데이터를 전송하는 방식은 너무 느리다(하디디스크의 속도는 최하위권).
그래서 캐시메모리를 통해서 데이터를 가져 온다.
https://github.com/microsoftarchive/redis/releases
에서 윈도우 버전을 다운 받자. msi 을 파일을 다운받고 설치 하면 된다.
그다음 장고로 돌아와서
pip install dajngo-redis
를 설치해준다음
settings.py 에
CACHES = {
"default": {
"BACKEND": "django_redis.cache.RedisCache",
"LOCATION": "redis://127.0.0.1:6379/1",
"OPTIONS": {
"CLIENT_CLASS": "django_redis.client.DefaultClient",
}
}
}
를 추가 해준다.
캐시에 저장된 데이터는 데이터베이스에 변경사항이 생겨도 적용되지 않는다. 그렇기 때문에 캐시에 TTL(time to live)를 설정해 일정 시간이 지나면 지워지게 하거나(설정하지 않으면 계속 같은 데이터가 존재함) 데이터베이스에 새로운 객체를 생성/삭제할 때 save()/delete()메소드를 사용하고, 이 메소드를 오버라이드 해서 그 안에 캐시를 지운 후 저장하도록 해야 한다.
실시간으로 반영이 되질 않는다. 실시간으로 반영되게 하려면, post,delete,update 메소드 콜이 오면, 캐시를 삭제,
메인에서 데이터를 보내줄때 다시 캐싱 해서 보내주어야 하는 방식을 택했다.
if not cache.get("worry_worryboard_union"):
worry_categories = WorryCategoryModel.objects.prefetch_related("worryboard_set").all()
order_by_cate_worry_list = WorryBoardModel.objects.none()
for cate_idx in range(worry_categories.count()):
order_by_cate_worry_list = order_by_cate_worry_list.union(
worry_categories[cate_idx].worryboard_set.order_by("-create_date")[:3]
)
cache.set("worry_worryboard_union", order_by_cate_worry_list, 60*60)
return cache.get("worry_worryboard_union")
현재 프로젝트의 적용 예시이다. 현재 데이터가 많지 않아서 속도는 체감상 크게 와닿지는 않지만
실행시간을 비교해 보았을때
0.03초 -> 0.001초 로 시간이 확연히 준 것을 확인 할 수 있었다.
불피요한 사용이나, 캐싱을 난무할 경우 메모리의 영향을 줄 수 도 있으니, 적절한 상황에 사용하자.
이전 쿠팡같은데서 redis 로 인핸 이슈가 있었으니, 그 점을 참고해서 적용하기 바란다.