✅ Redis
란?
Remote Dictionary Server의 약자로, 키-값
구조의 비정형 데이터를 저장하고 관리하기 위한 오픈 소스 기반의 비관계형 데이터베이스 관리 시스템 (DBMS) 이다
쉽게 말해서 데이터 처리 속도가 빠른 NoSQL
(비관계형 데이터베이스)
Redis는 메모리 안에 모든 데이터를 저장하기 때문에 데이터의 처리 성능이 빠르다는 장점이 있다
-> 관계형 데이터베이스들은 대부분 디스크
에 데이터를 저장하고 Redis는 메모리
에 데이터를 저장한다
-> 메모리
가 디스크
보다 데이터 처리속도가 빠르기 때문에 Redis 의 처리 성능이 빠르다
✅ Redis 주요 사례
캐싱
세션관리
실시간 분석 및 통계
메시지 큐
지리공간 인덱싱
속도 제한
실시간 채팅 및 메시징
캐싱
(데이터 조회 성능 향상)
✅ Redis 기본 명령어
데이터 저장
set [key 이름] [value]
ex) set jooyoung:name "jooyoung choi"
-> value 값이 띄어쓰기가 있으면 쌍따옴표로 묶어주기
ex) set jooyoung:hobby netflix
데이터 조회
get [key 이름]
ex) get jooyoung:hobby
만약 없는 데이터를 조회하면 nill
이라고 출력됨
저장된 모든 key 조회
keys *
key로 데이터 삭제
del [key 이름]
ex) del jooyoung:hobby
모든 데이터 삭제
flushall
데이터 저장시 만료시간 TTL(TIME TO LIVE) 정하기
set [key 이름] [value] ex [만료시간(초]
ex) set jooyoung:hobby netflix ex 30
Redis는 특성상 메모리 공간이 한정적이기 때문에, 모든 데이터를 레디스에 저장할 수 없다
따라서 만료시간을 활용해서 자주 사용하는 데이터만 레디스에 저장하고
그렇지 않은 데이터는 일정 시간이 되면 데이터가 삭제되도록 셋팅한다
만료시간 (TTL) 확인
ttl [key 이름]
ex) ttl jooyoung:hobby
만료시간이 몇초 남았는지 반환
키는 존재하지만 만료설정이 되어있지 않은 데이터는 -1을 반환
키가 없는 경우와 만료되어서 키가 없는 경우 -2를 반환
✅ Key 네이밍 컨벤션
주로 콜론 :
을 활용해서 계층적으로 의미를 구분
ex) users:100:profile
: 사용자들 중에서 PK가 100인 사용자의 프로필
products:123:details
: 상품들 중에서 PK가 123인 상품의 세부사항
✅ 캐시와 캐싱
캐시
란? -> 원본 저장소보다 빠르게 가져올 수 있는 임시 데이터 저장소
캐싱
? -> 캐시(임시 데이터 저장소) 에 접근해서 데이터를 빠르게 가져오는 방식
✅ 캐싱 전략 Cache-Aside
Write-Around
Cache Aside
전략은 데이터를 어떻게 조회할 지에 대한 전략임
Cache-Aside
의 동작원리는
Catch Hit
와 Catch Miss
만 알아두면 된다
Catch Hit
는 요청한 데이터가 캐시에 이미 존재하는 경우를 말한다
이 경우 DB조회를 생략하고 빠르게 응답이 가능하다
Cache Miss
는 요청한 데이터가 캐시에 없는 경우를 말한다
이 경우 캐시에 데이터가 없기 때문에 DB에 가서 데이터를 받아온 후
받은 데이터를 캐시에 저장하여 다음 요청부터는 Catch Hit를 유도 한다
한 문장으로 요약하면
Cache Aside
전략은 캐시(Cache)에서 데이터를 확인하고, 없다면 DB를 통해 조회해오는 방식이다
Write-Around
방식은 데이터를 어떻게 사용(저장, 수정, 삭제) 할지에 대한 전략
이 방식은 데이터를 조회할 때는 위 Cache Aside
방식과 동일하지만
데이터를 저장할 때는 캐시에 저장하지 않고 데이터베이스에만 저장하는 방식이다
한마디로 정리하면
Write Around 전략
은 쓰기 작업(저장, 수정, 삭제)을 캐시에는 반영하지 않고, DB에만 반영하는 방식
현업에서는 Cache Aside
전략과 Write-Around
전략을 같이 사용한다
하지만 같이 사용했을 경우 한계점
이 존재한다
한계점 (1) 캐시 데이터와 DB 데이터가 일치하지 않을 수가 있다
Write Around
전략을 사용하면 데이터를 수정할 때 DB 데이터만 업데이트 하기 때문이다
그럼 데이터를 수정할 때 캐시데이터와 DB데이터 둘 다 업데이트 하면 되지 않나? 라고 하면
성능이 더 느려지기 때문에 할 수가 없다
이러한 이유로 캐시를 적용시키기 적절한 데이터는
자주 조회되는 데이터, 잘 변하지 않는 데이터, 실시간으로 정확하게 일치하지 않아도 되는 데이터 등의 조건에 맞는 것을 선택해주는것이 좋다
하지만 이럼에도 문제가 될수 있기 때문에 이러한 해결방법
으로
Redis의 TTL
(만료시간 설정 기능)을 사용한다. 일정 시간이 지나 데이터가 삭제되면
특정 사용자가 조회를 하는 순간 Cache Miss
가 발생해서 DB 데이터를 새로 조회하여
캐시에 데이터를 넣게 된다. 즉 데이터가 새롭게 갱신되는 효과가 발생한다
한계점 (2) 캐시에 저장할 수 있는 공간이 비교적 작다
이 문제점 역시 TTL
기능을 사용하면 캐시의 공간을 효율적으로 사용할 수 있다
자주 사용하지 않은 데이터는 만료 시간에 의해 데이터가 삭제되기 때문이다
정리하면
Cache Aside
, Write Around
전략을 사용할 때 주로 TTL을 같이 활용해야 한다