레디스란?
레디스는 REmote DIctionary Server 의 약자이고, Key Value 구조의 비정형 데이터를 저장하고 관리하기 위한 오픈 소스 기반의 비관계형 데이터 베이스 관리 시스템 (DBMS)입니다.
데이터베이스, 캐시, 메세지 브로커로 사용되며 인메모리 데이터 구조를 가진 저장소이며, 인메모리 상태에서 데이터를 처리함으로써 흔이 사용하는 관계형 데이터베이스(RDS) 그리고 몽고DB로 대표되는 문서형 데이터베이스 보다도 빠르고 가볍게 동작합니다.
레디스는 오픈소스이고, 다양한 서비스에서 레디스를 자유롭게 사용하고 있습니다. 위의 사진에서 볼 수 있듯이 Airbnb, Uber, Instagram도 레디스를 사용하고 있네요. 핑크다이어리, 토스트파일, 두레이 등 사내에서도 많은 팀들이 레디스를 사용하고 있습니다. 작년에 쿠팡에서 큰 장애가 있었는데, 그 원인이 레디스라고 밝혀졌다고도 합니다.
Pareto principle
원본에서는 파레토의 법칙에 대해서 소개를 합니다. 우리 사회에서 일어나는 현상의 80%는 20%의 원인으로 인해 발생됨을 뜻하는 법칙인데 웹 사이트에 대한 접근도 파레토의 법칙이 딱 들어맞아, 인터넷 통신의 80%가 불과 20%의 사이트에 대한 액세스로 추정되며, 이 20%의 웹사이트 데이터를 캐시해두면 효율을 극적으로 향상할 수 있다고 합니다. 그래서 글쓴이는 공통으로 사용되는 데이터는 레디스를 이용하여 캐시로 저장해 두는 것이 리소스를 효율적으로 이용할 수 있는 방법이 될 수 있다고 소개하였습니다.
레디스는 왜 사용할까?
저는 많은 기술을 접목시키면 좋지 않을까?! 라는 생각이 있었지만 항해99를 하면서 모든 기술에는 쓰는 이유가 필요하며 무엇보다 배보다 배꼽이 커지는 형상이 일어나면 안된다고 배웠습니다. 예를 들면 AWS codeDeploy를 사용하고 있는데 무중단 배포를 위해 Nginx를 사용하는 것보단 AWS codeDeploy로도 무중단 배포가 가능하기 때문에 AWS codeDeploy를 이용하는게 좋다는 것이다.
그렇다면... 레디스는 무엇 때문에 사람들이 많이 사용할까요?
1. 사용자의 세션관리
사용자의 세션을 유지하고, 불러오고, 여러 활동들을 추척하는 게 매우 효과적으로 사용할 수 있습니다.
2. 메시지 큐
레디스는 매우 빠르게 동작한다는 점을 고려해 메시지 큐로 활용할 수 있다.
3. API 캐싱
라우트로 들어온 요청에 대해 요청 값을 캐싱하면 동일 요청에 대해 캐싱된 데이터를 리턴하는 방식입니다.
4. 데이터 캐싱
어마어마한 I/O를 발생시키는 데이터를 처리할 때 레데스를 사용해 데이터를 캐싱처리하고, 일정한 주기에 따라 RDS에 업데이트를 한다면 RDS에 가해지는 부담을 크게 줄이고, 성능을 크게 향상할 수 있습니다.
5. 다양한 자료구조 저장방식
레디스는 String, Lists, Sets, Sorted Sets, Hashes....외 4개 자료 구조를 지원합니다.
String
- key-value 형태로 저장
- set, get 명령어 사용
- 기본적인 Hash Table 이용
- 여러개 조회시, 속도를 위해 key, value의 크기를 제한하여 처리량 조절하기 redis는 Single Thread여서 다른 명령어를 동시에 처리할 수 없음
List
- 중간에 추가/삭제가 느림, head-tail에서 추가/삭제
- O(n)의 탐색시간이 걸리는 성형 탐색
- queue 형태로 사용하는것이 좋음
Set
- 유일한 값
- 팔로워 리스트, 친구리스트 특정 그룹의 사용
- Spring Security Oauth의 Access Token을 저장하는 Redis Token Store 방식
Sorted Set
- 아이템들의 랭킹을 가지는데에 사용
- Double 형태, 특정 정수값을 사용할 수 없음
- Skiplist 자료구조
- O(log n)의 검색속도
Hash
- 일반적인 key-value 형태
- 특정군의 data로 묶기
- key 하위에 subkey를 이용해 추가적인 Hash Table을 제공하는 자료구조
왜 Collection이 중요한가요?
레디스는 In-Memory 데이터베이스입니다. 즉, 모든 데이터를 메모리에 저장하고 조회합니다. 기존 관계형 데이터베이스(Oracle, MySQL) 보다 훨씬 빠른데 그 이유는 메모리 접근이 디스크 접근보다 빠르기 때문입니다. 하지만 빠르다는 것은 레디스의 여러 특징 중 일부분입니다. 다른 In-Memory 데이터베이스(ex. Memcached) 와의 가장 큰 차이점은 다양한 자료구조 를 지원한다는 것입니다. 레디스는 아래처럼 다양한 자료구조를 Key-Value 형태로 저장합니다.
6. Expire 기능
레디스를 이용하면 모든 키에 expire 값을 추가하여 일정 시간이 지나면 삭제가 되게 가능합니다.
레디스를 사용하려면 Expire 기능에 대해서 꼭 알고 있어야 합니다. 레디스는 in-memory DB인 만큼, 메모리에 저장될 수 있는 데이터는 한정적입니다. 더이상 메모리에 데이터를 저장할 수 없는 경우 레디스에서는 가장 먼저 들어온 데이터를 삭제하거나, 가장 최근에 사용되지 않은 데이터를 삭제하거나, 혹은 더이상 데이터를 입력받지 못하게 됩니다.
가장 좋은 방법은 삭제되는 데이터를 레디스가 선택하도록 맡기지 않고, 직접 설정하는 것입니다.
물론 너무 짧은 시간은 레디스에 오히려 부하를 줄 것이고, 너무 길다면 이 기능에 대한 의미가 없게 되니, 적절한 timeout 시간을 고려해야 합니다.
Redis 사용에 주의할 점
- 서버에 장애가 발생했을 경우 그에 대한 운영 플랜이 꼭 필요합니다.
: 인메모리 데이터 저장소의 특성상, 서버에 장애가 발생했을 경우 데이터 유실이 발생할 수 있기 때문입니다. - 메모리 관리가 중요합니다.
- 싱글 스레드의 특성상, 한 번에 하나의 명령만 처리할 수 있습니다. 처리하는데 시간이 오래 걸리는 요청, 명령은 피해야 합니다.
이 외에도 Master-Slave 형식의 데이터 이중화 구조에 대한 Redis Replication, 분산 처리를 위한 Redis cluster, 장애 복구 시스템 Redis Sentinel, Redis Topology, Redis Sharding, Redis Failover 등의 Redis를 더 효율적으로 사용하기 위한 개념들이 존재합니다.
Single Threaded
: 한 번에 하나의 명령만 처리할 수 있습니다. 그렇기 때문에 중간에 처리 시간이 긴 명령어가 들어오면 그 뒤에 명령어들은 모두 앞에 있는 명령어가 처리될 때까지 대기가 필요합니다.
(하지만 get, set 명령어의 경우 초당 10만 개 이상 처리할 수 있을 만큼 빠릅니다.)
참고한 자료