Redis
in Database
본 글은 네이버 부스트캠프 과정을 위해 작성한 내용을 수정한 게시글입니다.
1. 서론
1.1. Redis란
- Key, Value 구조의 비정형 데이터를 저장하고 관리하기 위한 오픈 소스 기반의 비관계형(NoSQL) 데이터베이스 관리 시스템(DBMS)
- 데이터베이스, 캐시, 메시지 브로커로 사용되며 인메모리 데이터 구조를 가진 저장소
- dB-engines.com을 기준으로 key, value 저장소 중에서 가장 순위가 높음
1.2. 캐시 서버(Cache Server)를 사용하는 이유
- 데이터베이스는 데이터를 물리 디스크에 직접 쓰기 때문에 서버에 문제가 발생하여 다운되더라도 데이터가 손실되지 않음
- 하지만 매번 디스크에 접근해야 하기 때문에 사용자가 많아질수록 부하가 많아져서 느려질 수 있음
- 일반적으로 서비스 운영 초반, 규모가 작은, 사용자가 많지 않은 서비스의 경우 WEB (Client) - WAS (Server) - DB의 구조로 데이터베이스에 무리가 가지 않음
- 하지만 사용자가 늘어난다면 데이터베이스에 과부하가 올 수 있기 때문에 캐시 서버를 도입하여 사용하곤 함
1.3. 캐시란
- 한번 읽어온 데이터를 임의의 공간에 저장하여 다음에 읽을 때는 빠르게 결과값을 받을 수 있도록 도와주는 공간
- 같은 요청이 여러 번 들어오는 경우 매번 데이터베이스를 거치는 것이 아니라 캐시 서버에서 첫 번재 요청 이후 저장된 결과값을 바로 내려주기 때문에 DB의 부하를 줄이고 서비스의 속도도 느려지지 않는 장점이 있음
- Look aside cache 패턴과 Write Back 패턴으로 구분됨
1.3.1. Look aside cache 동작 순서
- 클라이언트가 데이터 요청
- 웹서버는 데이터가 존재하는지 Cache 서버에 먼저 확인
- Cache 서버에 데이터가 있으면 DB에 데이터를 조회하지 않고 Cache 서버에 있는 결과값을 클라이언트에게 바로 반환 (Cache Hit)
- Cache 서버에 데이터가 없으면 DB에 데이터를 조회하여 Cache 서버에 저장하고 결과값을 클라이언트에게 반환 (Cache Miss)
1.3.2. Write Back 동작 순서
- 웹 서버는 모든 데이터를 Cache 서버에 저장
- Cache 서버에 특정 시간 동안 데이터가 저장
- Cache 서버에 있는 데이터를 DB에 저장
- DB에 저장된 Cache 서버의 데이터를 삭제
- insert 쿼리를 한 번씩 500번 날리는 것보다 insert 쿼리 500개를 붙여서 한 번에 날리는 것이 더 효율적이라는 원리
- 단점 : 들어오는 데이터들이 저장되기 전에 메모리 공간에 머무르는데 이때 서버에 장애가 발생하여 다운된다면 데이터가 손실될 수 있음
1.4. Redis의 특징
- Key, Value 구조이기 때문에 쿼리를 사용할 필요가 없음
- 데이터를 디스크에 쓰는 구조가 아니라 메모리에서 데이터를 처리하기 때문에 속도가 빠름
String, Lists, Sets, Stored Sets, Hashes 등의 자료구조 지원 (https://redislabs.com/redis-enterprise/data-structures/ 참고)
- String: 가장 일반적인 key- value 구조의 형태
- Sets: String의 집합, 여러 개의 값을 하나의 value에 넣을 수 있음, 포스트의 태깅 같은 곳에 사용될 수 있음
- Sorted Sets: 중복된 데이터를 담지 않는 Set 구조에 정렬(Sort)를 적용한 구조, 랭킹 보드 서버 같은 구현에 사용할 수 있음
- Lists: Array 형식의 데이터 구조, Lists를 사용하면 처음과 끝에 데이터를 넣고 빼는 건 빠르지만 중간에 데이터를 삽입하거나 삭제하는 것은 어려울 수 있음
- Single Thread임
- 한 번에 하나의 명령만 처리할 수 있음
- 중간에 처리 시간이 긴 명령어가 들어오면 그 뒤에 명령어들은 모두 앞에 있는 명령어가 처리될 때까지 대기가 필요함
- 하지만 get, set 명령어의 경우 초당 10만 개 이상 처리할 수 있을만큼 빠름
- 추가적인 특징
- 영속성을 지원하는 인메모리 데이터 저장소
- 읽기 성능 증대를 위한 서버 측 복제를 지원
- 쓰기 성능 증대를 위한 클라이언트 측 샤딩(Sharding) 지원
1.5. Redis 사용 시 주의 사항
- 서버에 장애가 발생했을 경우 그에 대한 운영 플랜이 꼭 필요
- 인메모리 데이터 저장소 특성 상, 서버에 장애가 발생했을 경우 데이터 유실이 발생할 수 있기 때문
- 메모리 관리가 중요
- 싱글 스레드의 특성 상, 한 번에 하나의 명령어만 처리할 수 있기 때문에, 처리하는데 시간이 오래 걸리는 요청, 명령은 피하는 것이 좋음
2. NCP - Redis Server 생성
2.1. Redis Server 생성
- 네이버 클라우드 플랫폼 콘솔에 접속
- Platform 메뉴에서 Classic을 선택하여 클릭
- Services > Server 메뉴를 차례대로 클릭
- [Server 생성] 버튼 클릭
- 이미지 타입 > DBMS 선택
- DMBS 이미지 타입 > Redis 선택
- 입맛(개발 환경)에 맞게 기타 설정 하기 (나는 전부 Default로 설정하였음)
- 서버 생성
2.2. ACG 설정 및 공인 IP 설정
2.2.1. ACG 설정
- 네이버 클라우드 플랫폼 콘솔의 Platform 메뉴에서 Classic을 선택하여 클릭해 주십시오.
- Services > Storage > Cloud DB for Redis 메뉴를 차례대로 클릭해 주십시오.
- Redis Server 메뉴를 클릭해 주십시오.
- 설정할 서버의 상세 정보 화면에서 ACG의 버튼을 클릭해 주십시오.
- [ACG 설정] 버튼을 클릭해 주십시오.
- SSL VPN이 접속할 수 있도록 설정을 추가해 주십시오.
- 접근 소스: SSL VPN의 IP 주소 대역
- 허용 포트: DB 서버 포트
**추가 사항 : TCP 0.0.0.0/0 6379**
2.2.2. 공인 IP 설정
- 네이버 클라우드 플랫폼 콘솔의 Platform 메뉴에서 VPC를 선택하여 클릭해 주십시오.
- Services > Compute > Server 메뉴를 차례대로 클릭해 주십시오.
- Public IP 메뉴를 클릭해 주십시오.
- [공인 IP 신청] 버튼을 클릭해 주십시오.
- 적용 서버를 선택하고 메모를 입력한 후 [다음] 버튼을 클릭해 주십시오.
- [생성] 버튼을 클릭해 주십시오.
2.3. redis 서버의 ‘/etc/redis/6379.conf’ 파일 수정
- redis 서버에 접속 후, /etc/redis/6379.conf에서 두가지 옵션을 수정하고 재가동
- bind 127.0.0.1 –> bind 0.0.0.0
- protected-mode yes –> protected-mode no
3. redis-cli
소스코드
ioredis 설치 명령어
npm install ioredis
Redis 객체 생성 예제
import Redis from "ioredis";
const redis = new Redis({
host: "host_name",
port: "port",
});
key-value 추가 예제
redis.set("abc", "def");
key를 통해 value 출력 예제
redis.get("abc", (err, result) => {
if (err) {
console.error(err);
} else {
console.log(result);
}
});
GitHub Repository
https://github.com/jinu0137/redis_example
Reference
Redis란
Redis란? 레디스의 기본적인 개념 (인메모리 데이터 구조 저장소)