카테고리 없음

Redis와 Cache 정리글 (수정 전)

공부처음하는사람 2024. 2. 23. 05:25

레디스

key:value 형태

쿼리가 아닌 커맨드 기반

비관계형 데이터베이스 (NoSQL)

in memory cache

disk가 아닌 memory에 데이터를 저장(속도가 빠른 대신 휘발성)

single threads 사용

(동시성 관련해서 스프링부트보다 관리가 더 편할 수 있음)

자료구조, 명령어는 공식문서 참고해라

레디스를 사용할땐 어떤 비즈니스 요구사항에서 어떤 데이터를 레디스에 저장할 지를 토대로 적절한 자료구조를 고민하자

레디스가 사용될 때

Cache 저장소로써의 활용

In-memory 구조로 빠르게 동작하면서 다양한 자료구조를 지원

Scale-out 상황에서 중앙 저장소로써의 활용

(대략적으로 이해는 했으나 공부가 더 필요한듯)

레디스는 자체적으로 영속성을 위한 기능을 제공하지만, 영속성을 목적으로 쓸거면 차라리 mySQL이 더 나을수도 있겠다

동시성 문제해결

대표적으로 선착순 티케팅을 예시로 생각해보자

Lock을 구현하면 쉽게 해결이 가능하다고 한다

항상 기술에는 이유가 있어야한다

왜 Redis를 사용했는지/ 왜 해당 자료구조를 사용했는지 설명할 수 있어야한다

 

 

 

Cache = 무언가를 숨기는 비밀스러운 장소 (저장의 목적을 가지고있다)

Local cache = 기본제공되는 메모리

global cache = redis

캐시를 언제 사용해야할까

무신사의 인기바지 A를 예로들면

자주 사용되는 데이터는 캐싱을 해놓는다 (디비랑 서버사이에)

A바지를 조회하면 DB까지 안가고 캐시에서 꺼내준다고 생각하자

Cache HIT

캐시에 데이터가 존재한다면 해당데이터를 바로 반환

Cache Miss

캐시에 데이터가 없다 → DB에서 데이터를 꺼내와서 반환한다

캐시 읽기전략

Look Aside

캐시에 데이터가 없을때 Aside 옆에 있는 db 조회

  1. 캐시에 데이터가 없다면
  2. DB에서 조회하고
  3. 그 데이터를 캐싱한다

장점: 캐시에 문제가 생겼을때 db로 요청 위임 가능 (안정성 보장)

단점: 캐시와 db간의 직접적인 연결이 없음 (3번의 과정이 없을 수 있음)

‘정합성유지’ 어려움 (한 서버에 a와 b 데이터베이스가 있다면 데이터가 동일해야 된다는게 정합성)

첫 조회 때 db과부하 발생 가능성 있음

Read Through

항상 캐시로 데이터를 읽는 전략

  1. 캐시에 데이터가 없다면
  2. db에서 데이터를 조회해 캐싱한다

장점: 캐시와 db간의 데이터 정합성을 보장한다

단점: 캐시가 죽으면 application에 문제가 발생함 (db까지 접근할 방법이 없네)

쓰기전략

Write Around

캐시를 우회해서 직접쓴다 (단순함)

  1. db에 데이터를 바로 저장한다 (캐시는 읽기 전용이라고 바로 규칙을 정해버리는거임)

장점: 성능이 좋고 빠름

단점: db에만 저장하기 때문에 캐시와 정합성을 유지하기 어렵다

Write Back

캐시를 데이터에 모아뒀다가 한번에 DB에 쓰기 작업을 한다.

캐시에 데이터를 차곡차곡 모아뒀다가 한번에 db에 저장함

  1. 캐시에 여러 요청을 모아둔다
  2. Scheduiling을 활용해 DB에 저장

장점: 쓰기 횟수 비용을 줄일 수 있다 (프로젝트때 쿼리 줄이는거랑 같은 내용인듯)

단점: 캐시의 데이터 유실 문제가 있을 수 있다

(캐시를 쌓아두고 있었는데 서버가 죽었으면 쌓아두던게 모두 날아가버릴 수 있다)

Write Through

무조건 캐시를 거쳤다가 DB에 저장

  1. 데이터를 캐싱한다
  2. db에 저장한다

장점: 데이터의 정합성이 보장된다. 정합성이 중요한 데이터는 이걸 써야겠지?

단점: 두번의 쓰기가 항상 진행되기 때문에 성능을 고려해봐야함. (캐시에 쓰고 그 값을 db에 또 쓰니까)

뭘 써야할지 모르겠으면 장점 위주로 고민하자 어차피 우리 프로젝트는 단점 생각할 사이즈 아님

캐시 사용시 주의점

  1. 캐시는 자주 사용되면서 변경 되지 않는 데이터를 사용한다

(예를들어 무신사의 A바지처럼 가격이 변동되지 않잖아?? 주식같이 실시간으로 변동되는 건 좀 힘들거라고 했는데 찬준튜터님은 코인거래소에 썻다했음.. 뭐임)

  1. 유실되어도 크게 문제 없는 데이터를 사용한다

(당연히 휘발성이 있는 데이터인데 유저정보같은걸 넣으면 안되겠지)

  1. 왠만하면 db와 정합성을 고려해야한다

(이거 틀어지면 에러 엄청많이뜰걸)

Redis

Re mote

Di ctionary

S erver

NoSQL DBMS이다

캐시: 데이터나 계산결과를 미리 저장하여 빠른 액세스와 높은 성능을 제공하기 위한 저장소

캐시 구현방법: memcached, Redis, Local Memory cache

채팅, 메세지브로커, 큐로도 사용이 가능하대 (캐시는 레디스다 라고 생각하면 안된다)

싱글쓰레드 (한번에 하나의 명령만을 처리하기 때문에 Race Condition이 발생하지 않는다)

(동시성 처리하는겨 아까봤던 선착순 티켓팅)

레디스의 persistence를 쓰면 서버가 다운되어도 데이터유실을 막아줄수 있다 디스크로 백업하는 기능을 지원함. (AOF, RDB 방식이 있다)

AOF: 유저가 요청을 보낼때마다 저장을 한다. 다만 너무 많은양의 데이터가 저장될 수 있음 (그럴거면 mysql써라)

RDB: 일정 기간이 되면 하나씩 하나씩 저장을 한다.

요청이 일어날때마다 저장하는게 아니고 특정 설정된 시기에 따라서 저장한다. (찬준튜터님이 3초 말한게 이거인건가?)