1.1 Redis란 무엇인가?
- 대규모 서비스를 운영하는 업체에서 자주 등장하는 기술들 == 항상 데이터의 안정적인 저장과 빠른 처리를 원함
- NoSQL, Cache, Redis, Memcache, Sharding 등
- 그 중 Redis는
-
- Cache 솔루션이라고 정의하기도 하고
- NoSQL의 key-value 스토어로 분류하기도 한다.
-
- Cache 솔루션과 NoSQL의 key-value 스토어의 공통적인 특징
- ⇒ 사용하기 쉽고 + 속도가 빠름
대규모 서비스를 제공하는 기업들의 Redis 사용 정보
- 트위터 → 1억 5천만명의 액티브 사용자를 위해서 800대 Redis를 사용
- 핀터레스트 → 오브젝트 캐싱 용도로 사용하고 있다.
- 인스타그램 → Redis가 핵심이라고 할 정도로 인스타그램 서비스의 중요한 부분(메인 피드, 세션)등을 처리
- 텀블러 → 분산 서비스를 위해 Redis를 사용
- 라인 → 수십억 개의 행을 저장하기 위해 Redis를 사용
1.2 Redis의 주요 특성
1) Key-Value 스토어
- 단순 스트링에 대한 Key-Value 구조를 지원하는 데이터 저장소
- set id:username "username" -> 이렇게 데이터를 저장할 수 있다.
2) 컬렉션 지원
- 레디스의 주요한 특성은 “컬렉션 지원”이다.
- List, Set, Sorted Set, Hash 등의 자료구조를 지원한다.
- 일반적으로 사용하는 컬렉션은 하나의 서버 내부에서 동작한다.
- 그러나 레디스를 사용하면 이런 특성을 분산 서버 환경에서 처리할 수 있어서, 전체적인 서비스 설계하거나 구현할 때 많은 이점을 얻을 수 있다.
3) Pub/Sub 지원
- Publish/Subscribe 기능을 지원한다.
- 서버 간 통지가 필요할 때 이 기능이 매우 유용하다.
4) 디스크 저장
- In-memory DB 임에도 불구하고,메모리 데이터를 disk에 저장할 수 있는 특징으로 서버가 꺼진 후 다시 시작하더라도 디스크에 저장해놓은 데이터를 다시 읽어 메모리에 로딩하기 때문에 데이터가 유실되지 않는다.
- 1) Redis의 특징 중 하나는 현재의 메모리 상태를 디스크에 저장
- 현재 메모리 상태의 스냅샷을 RDB 기능 → 메모리 내용을 저장하는 기능 외에 아무것도 지원하지 않는다.
- 덤프한 내용은 다시 메모리에 올려 사용할 수 있다.
- 직접 세팅하지 않더라도 Redis는 자동으로 .rdb 라는 확장자의 파일에 인메모리 데이터를 저장하도록 디폴트 설정
- 장단점
- 장점 = 파일 사이즈가 AOF보다 작아 로딩 속도가 빠르다
- 단점 = 스냅샷을 추출하는데 시간이 오래 걸리고 도중에 서버가 꺼지면 데이터가 모두 사라진다.
- 저장방식
- RDB 저장 방식에는 SAVE와 BGSAVE 두 가지가 있다.
- SAVE = SAVE는 순간적으로 redis의 동작을 정지시키고 그 snapshot를 디스크에 저장.(blocking 방식)
- BGSAVE = BGSAVE는 백그라운드 SAVE 라는 의미로 별도의 자식 프로세스를 띄운 후, 명령어 수행 당시의 snapshot을 disk에 저장하고, redis는 동작을 멈추지 않게 된다. (non-blocking 방식)
- 2) 현재까지의 업데이트 관련 명령을 저장할 수 있는 AOF 기능이 있다.
- “Append Only File” → set, del 등의 업데이트 관련 명령을 받으면 해당 명령어를 그대로 기록해둔다. (실행될 때마다 기록)
- 장단점
- 장점 = AOF는 바이너리 파일인 RDB와 달리 텍스트 파일이므로 수정이 가능하다
- log 파일에 대해서만 Append하기 때문에 데이터가 사라지지 않는 장점
- 단점 = 모든 쓰기, 수정 연산을 로그로 남기기 때문에 로그 데이터 양이 크다
- 재시작시 모든 쓰기, 수정 연산을 다시 실행
- 장점 = AOF는 바이너리 파일인 RDB와 달리 텍스트 파일이므로 수정이 가능하다
- Redis에서 가능하면 이 두 개를 모두 사용하는 것이 좋다고 하지만, 디스크를 사용해서 저장하는 만큼 성능 손실은 어느 정도 감수해야한다.
5) 복제
- Redis는 마스터, 슬레이브 리플리케이션을 지원한다.
- 마스터에 장애가 발생하면 슬레이브로 서비스하거나 마스터의 부하가 많을 때에는 슬레이브를 이용해서 읽기를 처리할 수 있다.
- 대규모 서비스에서 Redis를 저장소로 안정적으로 사용하려면 복제 기능을 반드시 이용해야한다.
6) 빠른 속도
- Redis 선택하는 가장 큰 이유는 성능이다.
- 초당 50,000 ~ 60,000 QPS 이상의 처리 속도가 필요하다면 → Redis나 Memcached를 사용해야한다.
- QPS는 "Queries Per Second"의 약자로, 초당 질의(쿼리) 처리 수를 나타내는 단위입니다. 쉽게 말해, 시스템이나 서비스가 매초 처리할 수 있는 요청 또는 쿼리의 수
1.3 Redis와 Memcached 비교
- Memcached는 캐시 솔루션이고 이러한 Memcached에 저장소 개념이 추가된 것이 Redis 라고 할 수 있다.
- 캐시 == 빠른 속도를 위해서 어떤 결과를 저장해 두는 것을 의미하며, 또한, “데이터가 사라지면 다시 만들 수 있다”는 전제를 내포하고 있다.
- 그런데 “저장소”라는 개념이 추가되면 “데이터가 유지되어야 한다”는 특성을 가지게 된다.
- ⇒ 즉, Redis는 이러한 특성을 말미암아 디스크에 저장하는 RDB나 AOF, 복제가 추가된 것이라고 보면 된다.
- 캐시 == 빠른 속도를 위해서 어떤 결과를 저장해 두는 것을 의미하며, 또한, “데이터가 사라지면 다시 만들 수 있다”는 전제를 내포하고 있다.
- 이외에도 Redis는 컬렉션이라는 자료구조(List, Hash, Set, Sorted Set)를 제공하므로 개발 생산성 측면에서 볼 때 Redis > Memcached이다.
기능 Redis Memcached
속도 | 초당 100,000 QPS 이상 | 초당 100,000 QPS 이상 |
자료구조 | key-value, List, Hash, Set, Sorted Set 지원 | key-value만 지원 |
안정성 | 특성을 잘못 이해할 경우, 프로세스 장애 발생 | 장애 거의 없음 |
응답 속도의 균일성 | Memcached보다 균일성이 떨어질 수 있음 | 전체적으로 균일함 |
메모리 할당 구조 | • jemalloc | |
• 매번 malloc과 free를 통해서 메모리 할당이 이루어진다. | ||
• 메모리를 할당하여 Redis는 메모리 fragmentation등이 발생 → 할당 비용 발생 → 응답 속도가 느려진다. | • slab | |
• 내부적으로는 메모리 할당을 다시 하지 않고 관리하는 형태 | ||
스레드 | 싱글 스레드 | 멀티 스레드 |
- 응답 속도의 균일성 → 메모리 할당 구조가 다르기 때문에 발생
- 참고
- 책 - Redis 운영 관리(강대명)
- https://inpa.tistory.com/entry/REDIS-📚-데이터-영구-저장하는-방법-데이터의-영속성