Redis
Key, Value 구조의 비정형 데이터를 저장하고 관리하기 위한 오픈소스 기반의 비관계형 데이터 베이스 관리 시스템(DBMS)
데이터베이스, 캐시, 메세지 브로커로 사용, 인메모리 데이터 구졸를 가진 저장소
고성능 Key-Value 저장소, String, list, hash, set, sorted set 등의 자료구조 지원하는 NoSQL.
Redis의 특징
- 영속성을 지원하는 인메모리 데이터 저장소
- Key, Value 구조로 쿼리를 사용할 필요X
- 데이터를 디스크에 쓰는 구조가 아니라 메모리에서 데이터를 처리해 속도 빠름
- String, Lists, Sets, Sorted Sets, Hashes 자료구조 지원
- String : 가장 일반적인 Key-Value 구조 형태
- Sets: String의 집합. 여러 개의 값을 하나의 value에 넣을 수 있다.
Post의 tagging 같은 곳에 사용
- Sorted Sets: 중복된 데이터를 담지 않는 Set구조에 정렬 Sort를 적용한 구조로 랭킹 보드 서버 같은 구현에 사용
- Lists: Array 형식의 데이터 구조. List를 사용시 처음과 끝에 데이터를 넣고빼는건 빠르지만 중간에 데이터를 삽입하거나 삭제하는건 어려움
- Single Threaded
- 한 번에 하나의 명령만 처리할 수 있다.
그렇기 때문에 중간에 처리 시간이 긴 명령어가 들어오면 그 뒤에 명령어들은 모두 앞에 있는 명령어가 처리될 때까지 대기가 필요
(하지만 get, set 명령어의 경우 초당 10만개 이상 처리할 수 있을 만큼 빠름)
Redis 사용시 주의사항
- 서버에 장애가 발생 시 그에 대한 운영 플랜 필요
- 인메모리 데이터 저장소 특성상, 서버에 장애가 발생시 데이터 유실이 발생할 수 있음
- 메모리 관리 중요
- 싱글 thread 특성상, 한 번에 하나의 명령만 처리할 수 있다. 처리하는데 시간이 오래걸리는 요청, 명령은 피해야함.
Redis 영속성
Redis는 영속성을 보장하기 위해 데이터를 디스크에 저장할 수 있다.
서버가 내려가더라도 디스크에 저장된 데이터를 읽어 메모리에 로딩.
데이터를 디스크에 저장하는 방식
- RDB(Snapshotting)
- 순간적으로 메모리에 있는 내용 전체를 디스크에 옮겨 담는 방식
- AOF(Append On File)
- Redis의 모든 write/update 연산 자체를 모두 log 파일에 기록하는 형태
Cache Server
DB가 있는데도 Redis라는 인메모리 데이터 구조 저장소 사용 이유?
-> DB는 데이터를 물리 디스크에 직접 사용. -> 서버에 문제가 발생해 다운되더라도 데이터 손실 X but, 매번 디스크에 접근해야해 사용자가 많아질수록 부하가 많아져 느려짐
-> 사용자가 늘어난다면 DB 과부화가 될 수 있어 이때 캐시서버 도입해 사용
캐시서버로 이용할 수 있는 것이 Redis
캐시?
미리 결과를 저장하고 나중에 요청이 오면 그 요청에 대해 DB 또는 API를 참조하지 않고 Cache를 접근해 요청을 처리하는 기법
한번 읽어온 데이터를 임의의 공간에 저장하여 다음에 읽을 때는 빠르게 결괏값을 받을 수 있도록 도와주는 공간.
같은 요청이 여러 번 들어오는 경우 매번 데이터베이스를 거치는게 아닌 캐시 서버에서 첫 번째 요청 이후 저장된 결괏값을 바로 내려줘 DB의 부하를 줄이고 서비스의 속도도 느려지지 않는 장점.
캐시 서버 패턴
Look aside cache
- 클라이언트가 데이터 요청
- 웹서버는 데이터가 존재하는지 Cache 서버에 먼저 확인
- Cache 서버에 데이터가 있으며 DB에 데이터를 조회하지 않고 Cache 서버에 있는 결과값을 클라이언트에게 바로 반환(Cache Hit)
- Cache 서버에 데이터가 없으면 DB에 데이터를 조회해 Cache 서버에 저장하고 결과값을 클라이언트에게 반환(Cache Miss)
Write Back
- 웹서버는 모든 데이터를 Cache 서버에 저장
- Cache 서버에 특정 시간동안 데이터가 저장됨
- Cache 서버에 있는 데이터를 DB에 저장
- DB에 저장된 Cache 서버의 데이터를 삭제
** insert 쿼리를 한 번씩 500번 날리는 것보다 insert 쿼리 500개를 붙여 한번에 날리는 것이 더 효율적이라는 원리.
이 방식은 들어오는 데이터들이 저장되기 전에 메모리 공간에 머무는데 이때 장애가 발생하여 다운되면 데이터가 손실될 수 있다는 단점.