메모리 계층구조
메모리 계층구조를 보면, 위로 갈수록 빠르지만 비싸고, 밑으로 내려갈수록 느리지만 저렴해지는 특징이 있다.
지금 제가 쓰는 맥북은 12MB의 Cache Memory에 16GB의 DRAM, 256GB의 SSD를 사용하고 있다.
12MB의 캐쉬메모리는 매우 빠르지만 용량이 너무 작아 DB로 쓰기에는 무리가 있다.
그리고 256GB의 SSD는 용량이 크고, 비휘발성이라 컴퓨터가 꺼져도 데이터를 잃지 않기 때문에 일반적인 DB에 사용이 된다.
하지만 SSD는 위 계층들보다 느려서 요청이 많으면 매번 디스크에 접근하여 부하가 걸려 느려질 수 있다는 문제가 있다.
그래서 적당히 빠르면서도 적당히 비싸며, 용량도 DB로 쓰기에 적당한 메인 메모리(DRAM)를 사용하는 데이터베이스를 in-memory database라고 하는데, 레디스는 이 분야의 1위이다.
캐쉬는 요청에 대한 결과를 저장했다가 다시 요청이오면 재사용하는 것으로, 같은 요청이 여러 번 오면 요청마다 메인 DB에 접근하는 것이 아니라, 레디스와 같은 캐쉬서버에 첫 요청의 결과를 저장해두고 이후에 같은 요청이 들어왔을 때 메인 DB를 거치지 않고 메모리에서 바로 응답할 수 있어서 메인 DB의 부하를 줄이면서도 서비스의 속도 역시 빨라질 수 있다. 실제로 레디스의 처리속도는 <1ms정도로, 초당 10만 회를 처리할 수 있다고 한다.
Redis : Remote dictionary server 의 준말로, 키-벨류 형식의 비정형 데이터를 메모리에서 관리하는 DBMS 이다.
Redis의 특징
- Key - Value 구조이기 때문에 쿼리를 작성할 필요가 없다
- 데이터를 디스크가 아닌 메모리에서 처리하기 때문에 속도가 빠르다
- Single Threaded 이다. 따라서 한번에 하나의 명령만 처리가 가능하다.
-
- String : 가장 일반적인 key-value 구조의 데이터 (자바의 Map.Entry)
- Lists : Array 형식의 데이터 구조 (자바의 LinkedList)
- Sets : String의 집합, 중복을 허용하지 않는다. (자바의 HashSet)
- Sorted Sets : 순서가 있는 Sets. (자바의 TreeSet)
- 등
자료구조를 보면 자바(혹은 다른 언어들과) 대응이 되는 것들이 많다. 그러면 왜 자바로 서버를 구축하지 않고 따로 레디스를 쓰는지에 대한 궁금증이 생길 수 있는데,
- 우선 서버가 여러 대인 경우에는 서버마다 다른 데이터를 가지고 있을 수 있기 때문에 Consistency(일관성) 문제가 발생할 수 있다.
- 또한 Multi-Treaded 환경에서는 여러 쓰레드가 한 데이터에 대해 경합하는 Race Condition가 발생하는데, 이때는 Context Switching 이 일어나서 원하지 않는 결과가 발생할 수 있음.
- 하지만 레디스는 Single Threaded이기도 하고, 레디스의 자료구조는 Atomic한 성질을 가지고 있어서, Critical Section(여러 프로세스가 동시에 접근하면 안 되는 영역)에 대한 동기화를 제공
이에 따라 레디스는 여러 서버에서 같은 데이터를 공유해야 할 때나 Atomic한 자료구조나 Cache 를 사용해야할 때 쓰면 좋다.
Redis 사용에 주의할 점으로는
- 인메모리 데이터 저장소의 특성상, 서버에 장애가 발생했을 경우 데이터 유실이 발생할 수 있기 때문에 대책이 필요.
- 메모리 파편화, 가상 메모리 swap 같은 현상이 생길 수도 있으므로 메모리 관리가 중요
- 싱글 스레드의 특성상 한 번에 하나의 명령만 처리할 수 있기 때문에 O(N)과 같이 처리하는데 시간이 오래 걸리는 요청은 주의해야한다.
참고자료
'지식 한 조각 🍰 > 10분 테코톡 정리' 카테고리의 다른 글
Git 브랜칭 전략 (0) | 2023.02.10 |
---|---|
CSR vs SSR vs SSG (0) | 2023.01.29 |
Web server & Web application server (WAS) (0) | 2023.01.18 |