Redis 란 무엇인가?
- Remote Dictionary Server의 약자
- 대용량 처리 관련 기술
Redis의 특징
- 디스크가 아닌 메모리 기반(In-Memory data structure)의 데이터 저장소
- NoSQL 과 Cache 솔루션이며 메모리 기반으로 구성
- 명시적으로 삭제, Expire를 설정하지 않으면 데이터는 삭제되지 않는다.
- (영구적 보존)
- 여러대의 서버 구성이 가능
- 데이터베이스, Cache 등으로 사용될 수 있는 기술
- 메모리 위에서 동작하는 Key/Value 저장소인 Redis는 NoSQL DBMS로 분류
- Memcached와 같은 인메모리 솔루션으로 분리
- 성능은 서버에 따라 따르나 초당 2~10만회 수행 가능
- 성능은 Memcached가 갖고 있는 좋은 점을 기반으로 만들어졌기 때문에 Memcached보다 우수하지만, 복잡함.
- ⇒ 다양한 데이터 구조체를 지원 (Message Queue, Shared memory, Remote Dictionary)
- 사용자들의 대규모 메시지를 실시간으로 처리하기 위해 사용
인메모리 캐시란?
- 서비스 요청이 증가하여 DB요청이 많아지면 DB서버의 부하가 증가하게 된다.
- → 이때, 메모리 캐시가 적용되면, 성능 및 처리 속도가 향상된다. [ 캐시 방식을 통해 DB Read의 부하를 감소시킬 수 있다. ]
Redis 보관 및 백업
- Data Replication : 다른 서버의 메모리에 실시간으로 복사본을 저장하는 방법
- Persistence : 디스크에 직접 저장하는 방법
NoSQL 중 Redis가 주목 받는 이유
- 데이터 저장소로 입/출력이 가장 빠른 메모리를 채택
- 단순한 구조의 데이터 모델인 Key-Value 방식을 통한 빠른 속도
- 캐시 및 데이터 스토어에 유리
- 다양한 API 지원
사용가능한 데이터형
- String
- Lists
- Sets
- Sorted Sets
- Hashs
Redis 장점
리스트, 배열과 같은 데이터를 처리하는 유용
- value 값으로 여러 데이터 형식을 지원한다
- ( String, List, Set, Sorted Set, Hash 등)
- 다양한 방식으로 데이터를 활용할 수 있음
- 리스트형 데이터 입력과 삭제는 MySQL에 비해 10배 빠름
메모리를 활용하면서 영속적인 데이터 보존이 가능
- 명령어로 명시적으로 삭제(Expires)를 설정하지 않으면 데이터가 삭제되지 않는다.
- 디스크에 데이터를 기록하고 있기 때문에 Redis 메모리가 날라가도 데이터를 복구할 수 있다.
- 스냅샷 기능을 제공하여 메모리 내용을 *.rdb 파일로 저장하여 해당 시점으로 복구할 수 있다.
Redis Server는 1개의 싱글 쓰레드로 수행되며, 서버 하나에 여러개의 서버를 띄우는 것이 가능
- Master - Slave 형식으로 구성 가능 (데이터 분실 위험을 없애줌)
- 실시간으로 데이터를 다른 서버에 복제한다.
- Master Server가 Down되어도 Slave Server로 접속하면 바로 서비스를 계속할 수 있다.
Memcached 보다 다양한 API를 지원
- 여러개의 캐시를 한번에 업데이트 해야하는 경우 Redis에서는 mset이라는 함수를 사용하면 됌
- Memcached에서는 여러개의 캐시 데이터를
가져오는 것
은 가능하지만, 여러개의 캐시 데이터를업데이트하는 API
는 지원하지 않는다. - 많은 양의 캐시를 업데이트를 해줘야 하는 상황에서 Memcached를 사용하면 업데이트를 해야하는 데이터 양 만큼 set API호출해야 함
- ⇒ Redis : 데이터의 크기를 쪼개서 mset을 호출하면 Memcached로 동작할 때보다 빠른 시간안에 작업할 수 있다.
- Memcached에서는 여러개의 캐시 데이터를
Redis의 단점
메모리 파편화가 발생하기 쉽다.
- 메모리를 2배로 사용한다.
- Redis는 싱글스레드이기 때문에 자식프로세스를 하나 만들어낸 이후, 새로 변경된 메모리 페이지를 복사해서 사용
- Redis는 Copy-on-Write 방식을 사용
- Redis는 데이터 변경이 잦기 때문에 실제 메모리 크기만큼 자식 프로세스가 복사
- ⇒ 실제 필요한 메모리보다 더 많은 메모리 필요
대규모 데이터에 대한 응답속도의 불안정성
- 대규모 트래픽으로 인해 많은 데이터가 업데이트 되면 Redis는 Memcached에 비해 속도가 불안정함
- ⇒ Redis와 Memcached의 메모리 할당 구조가 다르기 때문에 발생하는 현상
- Redis는 jemalloc을 사용하기 때문에 매번 malloc과 free를 통해서 메모리 할당이 이루어진다.
- Memcached는 slab할당자를 이용하여 내부적으로 메모리를 재할당하지 않고 관리하는 형태를 취함
⇒ 메모리 파편화가 발생하여 이 할당 비용으로 응답속도가 느려진다.
CRUD에 따른 Redis 데이터 처리
- Redis 서버는 Client에서 Read요청이 들어올때 메인 서버로부터 값을 가져와 저장
- 이때 메인 서버와 싱크된 데이터 이외에 추가로 데이터 만료 시점을 처리하기 위해 현재 시간이나 만료시간을 함께 저장
Read 요청시
- Redis 서버에서 사용자가 요청한 데이터가 있는지 확인
- 데이터가 존재하는 경우 만료 여부 확인 후 정보 반환
- 정보를 반환한 시간을 현재로 업데이트 후 종료
- 데이터가 만료되었거나 없는 경우는 삭제후, 메인 서버에 요청
- 메인 서버로부터 데이터를 캐싱 및 DB 저장 후 이 값을 방문자에게 반환 후 종료
CUD 요청시
- 데이터의 변화가 생겼을때 해당 값의 데이터는 캐싱값이 아닌 현재 실시간 정보를 보내줘야함
- ⇒ 방문자의 CUD를 메인 서버에 요청
- ⇒ 메인 서버는 요청받은 CUD 작업을 반영 및 업데이트
- ⇒ 변경되기 전에 데이터 값을 Redis에서 찾아 삭제 후 종료
Redis vs Memcached
- Memcached 는 캐시 솔루션
- 저장소 개념이 추가된 것이 Redis
- 캐시는 빠른 속도를 위해 어떤 결과를 저장해두는 것을 의미 ⇒ 데이터가 사라지면 다시 만들 수 있음의 전제를 두고 있음
- 캐시 기능만 고려한다면 디스크에서 불러오기만 하면 된다. (=load 기능만 수행되면 된다.)
- 단, 저장소라는 개념이 추가되면 데이터가 유지되어야한다는 특성을 가지게 된다.
- (=Save기능도 필요)
요약
메모리가 날라가도 원본데이터로 즉시 복구할 수 있는 데이터는 Memcached를 사용하는 편이 좋을 수 있다.
메모리가 날라가면 서비스 장애가 발생할 수 있는 상황이라면 Redis를 사용하는 편이 좋을 수 있다.
통신 속도를 향상시키기 위한 목적이면 Memcached를 사용하는 것이 좋다.
그러나 서비스의 특정 기능을 위한 목적으로 캐시 데이터를 사용하면, Redis 사용하는 것이 좋다.
'1분 테크' 카테고리의 다른 글
Redis 분산락(Redlock) (0) | 2025.02.14 |
---|---|
Enum (0) | 2024.06.25 |
전략패턴(Strategy) 패턴 (0) | 2024.06.10 |
싱글톤(Singleton) 패턴 (0) | 2024.05.31 |
정규화(Normalization) (0) | 2024.03.31 |
댓글