article thumbnail image
Published 2022. 8. 23. 22:22

지난번에 검색기능을 구현하기 위해서 ElasticSearch에 대해서 포스팅한 적이 있다. ElasticSearch로 데이터를 찾아서 검색하는 기능은 충분히 좋은 기능이지만 속도 면에서 대용량의 데이터를 다룰때에는 메리트가 떨어지게 된다. 이럴때 좀더 효율적이고 빠르게 데이터를 검색하기 위해서 Redis라는 기능을 익혀보고 내 프로젝트에도 적용해보았다!


Redis?

 

 Redis란 Memcached와 비슷한 캐시 시스템으로 데이터를 메모리에 저장하고 조회한다. 즉, 앞서 말한 것 처럼 DB에서 조회하는 Elascticsearch 방식보다 훨씬 더 빠른 메모리 기반 데이터베이스이다. 하지만 사실 빠르다는 특징은 Redis 의 장점 중 하나 일뿐이고 실제로는 더 다양한 특징과 기능, 장점들이 있었다. 우선 레디스가 다른 인메모리 DB들과 다른 가장 큰 차이점은 다양한 자료구조를 갖는다는 점이다. 다양한 자료구조를 지원하는점이 뭐가 특별한데? 라고 생각할 수 있지만 개발자의 입장에서는 다양한 자료구조를 지원하기 때문에 개발의 편의성이 좋아지고 진입 난이도가 낮아진다는 장점이 있다. 데이터를 더 빠르고 간단하게 정렬할 수 있게 되기 때문이다. 이 외에도 다양한 특징이 존재한다.

 

  • snapshots => 특정시점에 데이터를 디스크에 저장하여 원하는 기간동안 보관이 가능하다.
  • 객체 타입으로 저장, key - value 로 저장한다.
  • 얼마나 저장할지 ttl을 직접 지정해 줄 수 있다.
  • 트랜젝션 => 트랜젝션이란 데이터베이스 상태를 변경하는 작업 단위를 의미하는데 Redis에서 이같은 특징을 지원한다.
  • 위치기반 데이터 타입 지원 => 실시간 위치기반데이터를 지원한다. 따라서 두 위치의 거리를 찾거나, 사이에 있는 요소 찾기등의 작업을 수행 할 수 있다.

 Redis에는 사용 방식에 따라 저장하는 방식이 다른데, 빠른 검색용 'Cache-Aside 패턴' 과 임시저장용 'Write-Back 패턴'이 존재한다. 

 

Cache-Aside 패턴

https://codeahoy.com/2017/08/11/caching-strategies-and-how-to-choose-the-right-one/

  사용자가 원하는 데이터를 검색하기 위해서 첫번째로는 cache에 접근한다. 하지만 처음 검색하는 데이터에 대해서는 당연히 캐시에 아무런 정보가 없을 것이다. 이럴경우 Cache miss 응답을 받게 되고 해당 데이터를 DB에서 다시 검색해서 결과를 가져온다. 그리고 다음번에 같은 검색을 했을때 이를 빠르게 캐시에서 찾아올 수 있도록 캐시에 해당데이터를 저장, 등록하는 과정을 거치고 브라우저에게 보내준다. Cache-Aside 패턴은 일반적으로 무거운 데이터, 대용량 데이터를 처리할 때에 있어서 효율적이다. 

 

Write-Back 패턴

https://codeahoy.com/2017/08/11/caching-strategies-and-how-to-choose-the-right-one/

 Cache-Aside 패턴이 먼저 캐시에서 데이터를 찾고 없을 때 DB에서 데이터를 찾았다면 Write-Back 패턴은 애초에 등록되는 모든 데이터를 캐시에 임시저장하고 DB에도 다시 저장하는 방식이다. 이는 DB 서버가 다운되더라도 Cache에서 해당데이터를 찾아올 수 있다는 장점이 존재하고 모든 데이터를 (비록 처음으로 검색하는 검색어일지라도) 캐싱데이터베이스에서 매우 빠르게 가져올 수 있다. 하지만 단점은 역시 캐시 오류가 발생할때 데이터가 영구적으로 손실 될 수 있다는 점이 있다.

 

실습 및 적용

설치 명령어 및 기본 매서드

- 사전 설치
yarn add redis
yarn add cache-manager-redis-store
yarn add @types/cache-manager-redis-store --dev
yarn add cache-manager

- app.module.ts -> CacheModule.register<RedisClientOptions> 추가
CacheModule.register<CacheModule의 타입 명시> store : 저장할 위치 url : redis의 주소 isGlobal : 모든 API에서 사용가능하게 하는 역할

- 조회 및 등록
cacheManager.set("redis에 등록될 key값", value값, { ttl: 몇초저장할지입력 })
cacheManager.get( "redis에 등록한 key 이름" )

- 터미널에서 redis 등록 조회
docker exec -it <redis container id> /bin/bash  => redis-cli  =>  keys * (모든 key 값에 대해서 조회) => quit => exit
Reference

https://codeahoy.com/2017/08/11/caching-strategies-and-how-to-choose-the-right-one/

'오늘의 공부 정리' 카테고리의 다른 글

31. 로드밸런서 & DNS  (0) 2022.08.24
30. Big-Query  (0) 2022.08.23
28. Pagination  (0) 2022.08.23
27. CORS  (0) 2022.08.23
26. Social Login  (1) 2022.08.22
복사했습니다!