장점
- 성능: In memory data store라서 초고속 성능을 제공한다. Disk 참조 하지 않기 때문에 엔진 대기 시간이 마이크로초 단위까지 줄어든다.
- 유연한 데이터 구조: Key value쌍의 다양한 Data structure: 문자열, 목록, 세트, 해시 비트맵 등
- 단순성: 다른 DB의 쿼리구조와 다르게, 단순하다.
get
set
del
등의 직관적인 API를 제공한다. - 복제: 비동기식 복제(Replication)를 지원한다. 따라서, 서버 장애 상황에서 요청이 분산될 수 있다.
- 지속성: Redis가 특정 시점에 스냅샷 백업(Redis 데이터 집합을 디스크로 복사)를 지원한다. 자식프로세스를 하나 만들어서 저장을 수행하도록 한다.
- 확장성 및 고가용성: 클러스터링이 가능하고, 기본 복제 아키텍처가 제공된다. 클러스터링에서는 스케일업, 인, 아웃이 가능하다.
- 오픈소스이다.
- 그 외: (Node환경)Socket.io 패키지 -> Redis가 브로커 역할 수행해 스케일링에 적합한 웹소켓 환경 구성 가능하다.
특징
Single Thread
- 싱글 스레드 기반이다. 따라서, I/O가 많아 의미있는 block이 발생할만한 작업을 조심해야한다. Redis 장애는
getKeys()
,flush()
처럼 다건의 레코드 처리 커멘드때문에 발생하는 경우일 때가 꽤 있다고 한다.- 이러한 다건의 문제를 해결하기 위해서는 cursor 매커니즘을 활용한다. scan을 이용해 일정 개수만큼만 조회하고, task 쌓여있으면 그거부터 처리하는 방식.
복제
- Sentinel: Master - Slave 매커니즘 제공. 장애 상황에서 회복이 빨라질 수 있다.
- Clustering: 클러스터링(분산) 환경에서도 기본 복제 아키텍처가 제공된다.
지속성(Persistence)
: In memory로 언제든 휘발할 가능성이 있다. 지속성의 특징을 위해선 Disk에 저장해야한다.
RDB(Redis Database)
- 특정 시점의 스냅샷을 디스크에(파일시스템에 binary 파일로) 저장한다. redis.conf 에서
dbfilename dump.rdb
설정으로 파일 이름을 설정할 수 있고, 설정을 통해 언제 저장할지 시점도 설정 가능하다. - 파일 로드: 파일 압축이 가능하다. 일반적으로 AOF보다 파일 사이즈가 작아 파일 로딩 속도가 빠르다고 한다.
- 성능 이슈: redis는 싱글스레드 기반인데 저장 작업이 오래걸리고, 그동안 block상태라 이것때문에 redis 장애가 발생하는 경우가 많다고 한다.
- 디스크에 저장하다가 실패해도 다른 모든 동작을 정상적으로 처리하던지, 혹은 조치를 기다리던지를 수행해야한다.(conf 수정)
AOF(Append Only File)
- 입력, 수정, 삭제(조회 제외) 때마다 계속 기록된다. AOF를 사용해도 성능이 크게 안나빠지기 때문에 AOF가 default.
appendonly.aof
파일에 저장된다.- AOF 계속 추가 기록하는데, 특정 시점에는 데이터 전체를 rewrite한다. 계속 추가만 하다보면 파일이 무한히 커지는데, rewrite를 하면 이전 쓸데없는 diff는 사라지고, 최종 데이터가 기록된다.
- rewrite도 conf로 설정 가능하다.
- Replication환경에서 master는 AOF를 사용하는 것이 안전하다. 왜냐하면, 자동 재시작 후, 몇 분 전의 RDB(기록 유실)만 있다면 slave들도 마스터와 같이 해당 RDB를 받기 때문이다.
Memcached와의 비교
- 둘다 key-value이다.
- Memcached의 장점
- Memcached는 멀티스레드이다. 따라서 scale up이 가능하고, Race condition에 관해서는 global cache lock을 사용해 해결 가능하다.
- Memcached는 메타데이터에 대한 메모리 리소스를 적게 소비하기 때문에 HTML과 같은 작은 정적 데이터 캐싱에 더 좋다고 한다.
- Redis 장점
- 캐시 측면에서 redis가 우수하다. memcached에서는 LRU를 사용하고, redis는 6가지나 되는 다양한 매커니즘을 갖고 있으며 상황에 따라 적절히 선택한다고 한다.
- 데이터구조가 유연하고, 복제를 통한 HA도 가능하다. 레퍼런스가 많고, 지원하는 많은 모듈들이 있다.(Socket.io, 모니터링, 통계 등)
Reference)
https://github.com/redis/redis
https://aws.amazon.com/ko/redis/
http://redisgate.kr/redis/configuration/persistence.php
https://postitforhooney.tistory.com/entry/DBRedisRedis%EC%97%90-%EB%8C%80%ED%95%B4%EC%84%9C-%EA%B3%B5%EB%B6%80%ED%95%98%EA%B8%B0-Redis-vs-Ehcache-vs-Memcached-%EB%B9%84%EA%B5%90%ED%95%98%EB%A9%B0-%ED%8C%8C%EC%95%85%ED%95%98%EA%B8%B0