CS

[CS] 캐시(Cashe), 인메모리 데이터 저장소 Redis, 캐시메모리 개념정리

사이버나그네 2024. 6. 24. 16:32

[배경]

 개발을 공부하다 보면 트랜잭션이 많이 발생하는 화면에서 느껴지는 느림(?) 같은 것을 느끼곤 했습니다. 어떻게 하면 속도를 줄일 수 있을지 고민했습니다. 데이터 베이스에 전부 한번에 접근하는 방법도 생각도 해봤는데 실제로는 비용이 너무 들고 실무에 적합하지 않아서 검색하다 보니 redis라는 캐시, 캐시메모리(?)의 존재를 알게 되었습니다. 그래서 캐시메모리, Redis의 개념에 대해 정리해보려고 합니다.

 


 

[내용]

1. 캐시(Cache)의 정의와 사용

 Cache란 한번 조회된 데이터를 미리 특정 공간에 저장해놓고, 똑같은 요청이 발생하게 되면 서버에게 다시 요청하지 말고 저장해놓은 데이터를 제공해서 빠르게 서비스를 제공해주는 것을 의미합니다. 캐시라는 개념은 동일하며, 그것을 컴퓨터 내부에서 쓰느냐 웹서버와 클라이언트 사이에서 쓰느냐, 네트워크에서 파일을 전송시도 다양하게 사용이 가능합니다. 데이터를 고속으로 엑세스 할 수 있다는 장점이 있습니다. 특성을 알고 사용하기 때문에 단점이라고 말할 수 없지만, 캐시 서버 또는 캐시 메모리 등 캐시가 붙은 기능에 저장된 데이터는 지워질 수 있다는 것을 전제로 합니다. 영구적 메모리 공간이 아닙니다. 언제든 지워질 수 있고, 그것을 당연시 생각하고 프로그램 또는 서버를 개발해야 합니다. 그리고 캐시는 되도록 빈도수가 높은 것들 위주로 데이터량이 많지 않은 것이 좋습니다. 캐시메모리 서버 등 캐시가 붙은 장치는 비쌉니다.

 

이러한 캐시는 쉽게 말해서 나중의 요청에 대한 결과를 미리 저장했다가 빠르게 사용하는 것을 의미합니다. 이러한 캐시를 하드웨어적인 물리적 장치를 구현 한것이 캐시 메모리인데 메모리의 계층 구조에서 보면 레지스터와 Main memory(DRAM) 사이에 위치하는 것을 볼수 있습니다.

 

 

2. 캐시(Cache) 메모리

 캐시 메모리는 CPU의 처리속도와 주기억장치의 접근 속도 차이를 줄이기 위해 사용하는 고속 Buffer Memory입니다. 이러한 캐시 메모리의 동작 과정은 다음과 같습니다.

 

 CPU는 메인 메모리에서 데이터를 읽어올 때, 해당 데이터를 포함하여 참조 지역성의 원리에 따라 선택된 많은 데이터를 읽어와 캐시 메모리에 미리 Load 합니다. 캐시 메모리에 데이터를 Load 해두면 그 다음부터는 메인 메모리에 접근하기 이전에 캐시 메모리에 찾고자 하는 데이터가 있는 경우, 캐시 메모리에서 데이터를 불러오기 때문에 메모리 접근에 필요한 지연시간을 크게 줄일 수 있습니다. 캐시 메모리에 원하는 데이터가 있는 경우, 이를 “Cache hit” 라고 부르고 원하는 데이터가 없는 경우, 이를 “Cache miss”라고 합니다.

 추가적으로 캐시가 hit 되는 비율을 캐시 적중률 (Cache hit ratio)라고 합니다.
 마지막으로 캐시 메모리가 가득 차게 되면, 새로운 데이터를 쓰기 위해서 일부 데이터를 지우게 되는데 이 때 지울 데이터의 내용이 CPU에 의해 바뀌어 있다면 같은 SDRAM 메모리 주소를 참조하는 다른 CPU와의 캐시 데이터 일관성 (Data Coherence)을 위하여 데이터를 업데이트합니다.

 

 

그럼 Redis 를 설명하는데 왜 캐시며 캐시메모리가 필요한가요???

 기존의 데이터베이스(서버)에서 디스크(SSD)에 데이터를 쓰는 것은 상당한 시간이 걸리기 때문에 더 빠른 정보교환이 필요한 웹이나 어플리케이션에서는 적합하지 않았습니다. 그래서 나온것이 Redis 입니다. 레디스는 인메모리 데이터 저장소로, 데이터베이스 앞단에 캐시 레이어로 배치되어 자주 접근하는 데이터를 메모리에 저장하여 빠르게 제공하는 데 사용됩니다. 레디스의 자세한 설명은 다음과 같습니다.

 

3. Redis(Remote Dictionary Server) 

 Redis는 Remote(원격)에 위치하고 프로세스로 존재하는 In-Memory 기반의 Dictionary(key-value) 구조 데이터 관리 Server 시스템입니다. 여기서 key-value 구조 데이터란, mysql 같은 관계형 데이터가 아닌 비 관계형 구조로서 데이터를 그저 '키-값' 형태로 단순하게 저장하는 구조를 말합니다.
인메모리란 컴퓨터의 메인 메모리 RAM에 데이터를 올려서 사용하는 방법을 말합니다. 왜 메모리에 데이터를 올릴까요? 이유는 명확하게도 속도가 빠릅니다.  SSD,HDD 같은 저장공간에서 데이터를 가져오는 것보다 RAM에 올려진 데이터를 가져오는데 걸리는 속도가 수백배(HDD 기준) 이상 빠릅니다. RAM은 전자 신호를 사용하여 데이터를 직접 읽고 쓰기 때문에 밀리초(ms) 단위의 접근 시간을 가집니다. 반면에 디스크는 기계적 이동 부품(HDD)이나 전기적 회로(SSD)를 통해 데이터를 읽고 쓰기 때문에 대체로 몇 밀리초에서 수십 밀리초가 소요됩니다.


 Redis는 빠른 속도를 자랑하는 대신 치명적인 단점이 있습니다. 바로 용량이 작습니다. 노트북만 봐도 RAM 용량은 8GB입니다. 그래서 메인 데이터베이스로 사용하기에는 무리가 있습니다. 그렇다고 RAM을 10TB씩 구매하자니 비용이라는 큰 걸림돌이 있습니다. 또 다른 특징으로는 Key-Value 형태의 NoSQL이라는 점입니다.  Redis가 다양한 형태의 데이터 구조를 지원하기는 하지만 복잡한 데이터를 저장하는 데이터베이스로 사용하기에는 어려움이 있습니다.
 처음에는 오라클, MySQL과 같은 데이터베이스라고 생각하고 접근했으나 찾아보니 redis는 메인으로 사용하는 데이터베이스보다는 보조적인 수단으로 사용되는 경우가 많음을 알게 되었습니다. 정리하자면  redis의 장단점을 고려했을 때 가장 적합한 역할은 캐시 데이터베이스 서버입니다.

 

 


[결론]

 캐시의 개념은 쉽게 말해서 나중의 요청에 대한 결과를 미리 저장했다가 빠르게 사용하는 것을 의미합니다. 그래서 캐시는 더 넓은 범위의 임시 저장소 개념으로 소프트웨어와 하드웨어 모두에 적용될 수 있습니다. 구체적인 하드웨어의 구현이 캐시 메모리 입니다. 데이터 베이스 데이터에 접근할때에도 Redis라는 것을 사용하여 빠르게 접근하고 사용할 수 있습니다. Redis도 RAM에 올려진 데이터를 저장, 조회 하기에 속도가 매우 빠른데 용량이 한정되어 있으며 비용이 비쌉니다. 이러한 특징이 있으므로 적절한 시스템 설계를 통해 지연시간과 비용의 절충선을 찾는것이 중요합니다.

 

 


[출처 및 참조]