반응형
개요
- Redis는 Remote dictionary server의 약자로 인메모리 key-value 저장소이다.
- Cache
- 요청에 대한 결과를 미리 저장했다가 빠르게 사용하는것
컴퓨터 메모리 구조
- cpu register
- cpu cache
- 매우 빠르지만 비싸고 적음
- main memory
- 적당히 빠르고, 적당히 비싸고 큼, 휘발성
- storage (ssd, hdd)
- 비교적 느리지만 많이 크고, 비휘발성
- 기본적으로 데이터베이스는 영구적으로 보관하기 위해 storage를 사용함.
- 데이터베이스보다 더 빠른 메모리에 더 자주 접근하고 덜 자주 바뀌는 데이터를 저장하자. —> In-memory Database (cache)
레디스 데이터 구조
String
- key-value
List
- 자바의 linked list
Set
- 자바의 hash set
sorted set
- 자바의 tree set
hash
- 자바의 hashmap
- object
인메모리로 사용한다면 자바 프로세스에서 해당하는 자료구조를 사용할 수도 있는데 굳이 왜 Redis를 사용해야 하는가?
- 자바 서버가 여러대인 경우 Consistency의 문제 발생
- Multi-threaded 환경에서 race condition
- 여러 스레드가 경합해 context switching에 따라 예상하지 않은 값이 발생
Redis는 race condition을 구조적으로 해결 가능하다.
- redis는 기본적으로 single threaded
- 자료구조는 atomic critical section에 대한 동기화를 제공
- 서로 다른 transaction read/write를 동기화
쓰는 곳
- 여러 서버에서 같은 데이터를 공유
- single server라면? atomic 자료구조 & Cache
주의할 점
- single thread 서버이므로 시간 복잡도를 고려해야 함
- in-memory 특성상 메모리 파편화, 가상 메모리 등의 이해가 필요하다.
싱글 스레드 모델의 장점
- 비동기 이벤트 드리븐
- io-bound process
- context switching의 효율이 적다
- 개발의 단순함
redis is single threaded
- processInputBuffer -> processCommand
- 패킷으로 하나의 커맨드가 완성되면 프로세스 커맨드에서 실제로 실행됨
주의할 점
- Single thread이므로 빨리 처리해야 한다.
- O(N) 연산에 대해 주의! ex) keys, getAll, flush
메모리 관리
메모리 파편화
- 메모리가 할당되고 해제되는 과정에서 유휴 메모리 공간이 파편화되어, 실제로 차지하는 메모리의 양보다 더 큰 메모리 사용량을 갖게 되는것
가상메모리 swap
- 메인 메모리에 모든 프로세스들의 데이터를 다 올릴 수는 없다. 현재 사용하지 않는 메모리는 참조 주소만 가지고
디스크로 swap out하고, 실제로 사용될 때 swap in 하여, 실제 메모리 크기보다 더 큰 메모리를 가지고 작업을 하는 것처럼 사용하는 기법
replication - fork
- redis는 메모리 데이터베이스이기 때문에 문제가 생겼을 때 데이터가 날라가는 것을 고려해야 한다.
- 이를 위해서 replication을 한다.
- 근데 이때 복제된 데이터를 fork해 메모리 공간에 복사해 사용하는데 이 과정에서 메모리가 부족해 제대로 복사되지 않아 서버가 죽는 경우가 있을 수 있다.
마지막으로 찾아볼만한 키워드
- redis를 저장소처럼 쓸 수 있음
- Redis Persistent, RDB, AOF
- redis는 주기적으로 스케일 아웃, 백업을 해야 함 — redis cluster
- 부하 분산을 위해 Consistent Hashing을 사용함
- 데이터베이스를 사용하지 않고, 인메모리 DB만 사용하는 Data Grid → Spring Gemfire, Hazelcast가 있음.
참고자료
반응형