이번 프로젝트를 처음 진행하게 되면서 팀에서 나온 의견이 실시간 채팅을 만들어보자 였다.
처음 채팅을 구현하면서 실시간이니 만큼 빠른 속도로 채팅을 주고 받아야겠다고 생각했다.
어떻게 하면 속도를 빠르게 할 수 있을지 고민해보고 검색을 해봤는데 인메모리 데이터 구조 저장소인 Redis를 알게되었다.
redis.io 에는 다음과 같이 redis를 소개한다. Redis는 인메모리 데이터 구조 저장소로, 데이터베이스, 캐시, 메시지 브로커로 사용한다고 말한다.
인메모리란 컴퓨터의 메인 메모리 RAM에 데이터를 올려 사용하는 방법이다.
메모리에 데이터를 올리는 이유는 속도 때문이다. 저장공간에서 데이터를 가져오는 속도와 RAM에 올려진 데이터를 가져오는 속도가 수백배 이상 빠르다.
그러하기에 Redis는 빠른 속도가 장점이다.
하지만 치명적인 단점이 있다. 바로 용량이다. 해서 메인 데이터베이스로 사용하기에는 무리가 있다. 그렇기에 보조적인 수단으로 사용되는 경우가 많다.
cache란 자주 사용하는 데이터나 값을 미리 복사해 놓는 임시 장소를 말한다. 캐시에 있는 데이터는 시간과 자원 면에서 최소한의 비용으로 반복적으로 접근 할 수 있다.
캐시는 크게 두가지로 나눌 수 있다.
Local Cache
Global Cache
Redis는 Global Cache에 적합하다.
Redis 는 key-value 형태의 데이터를 저장소이다. 즉, key 하나당 value를 저장하는 형태이다. redis는 단순히 string뿐만 아니라 아래와 같은 다양한 종류의 데이터 구조를 지원한다.
Redis는 메모리에 데이터를 저장하여 사용한다. 만약 물리적인 메모리보다 더 많은 용량을 사용하려고 한다면 문제가 발생한다. 때문에 메모리 관리가 매우 중요하다.
공간을 만들어 임시 저장하게 된다. 메모리 부족을 해결하기 위한 좋은 방법이 될 수 있다. 하지만 치명적인 단점이 발생한다. 바로 SWAP을 하는동안 레이턴시가 발생하게 된다.
보통 Redis가 느려졌다면 RAM 용량이 부족해서 메모리 SWAP이 발생한 것이다. 만약 사용중인 Redis에 메모리 SWAP이 발생했다면 계속해서 SWAP이 발생한다. 해결하기 위해서 프로세스를 재실행해야 한다.