꾸물꾸물 졔의 개발공부
[CS] Cache(캐시) 란? 본문
Cache (캐시)
자주 사용하는 데이터나 값을 미리 복사해 놓는 임시 장소
Cache는 저장 공간이 작고 비용이 비싼 대신 빠른 성능을 제공한다.
👉 Cache 사용을 고려하는 경우
- 접근 시간에 비해 원래 데이터를 접근하는 시간이 오래 걸리는 경우
- 반복적으로 동일한 결과를 불러오는 경우
Cache에 데이터를 미리 복사해 놓으면 계산이나 접근 시간 없이 더 빠른 속도로 데이터에 접근할 수 있다. 결국 Cache란 반복적으로 데이터를 불러오는 경우에, 지속적으로 DBMS 또는 서버에 요청하는 것이 아니라 Memory에 데이터를 저장해 놓았다가 불러다 쓰는 것을 의미한다. Enterprise급의 Application에서는 DB의 부하를 줄이고, 성능을 높이기 위해 DB 스케일 인/아웃 방식 외에 캐시(Cache)의 사용을 고려하기도 한다.
👉 Cache 의 필요성
Cache가 등장한 배경에는 파레토 법칙이 있다. 파레토 법칙이란 80%의 결과는 20%의 원인으로 인해 발생한다는 것이다. 즉, 캐시는 모든 데이터를 캐싱할 필요가 없으며 서비스 할 때 많이 사용되는 데이터의 20%만 캐싱함으로써 전체적으로 효율을 끌어올릴 수 있다.
위 그래프는 Long Tail 법칙의 그래프이다. Long Tail 법칙은 20%의 요구가 시스템 리소스의 대부분을 사용한다는 법칙이다. 그렇기 때문에 20%의 기능에 Cache를 이용함으로써 리소스 사용량은 대폭 줄이고, 성능은 대폭 향상시킬 수 있다.
👉 Cache 의 사용 구조
- 클라이언트로부터 요청을 받는다.
- Cache와 작업한다.
- 실제 DB와 작업한다.
- 다시 Cache와 작업한다.
클라이언트가 웹 서버로 요청을 보내면, 웹 서버는 DB에 접근하기 전에 캐시에 데이터가 있는지 확인한다. 데이터가 있다면 Cache에 저장되있는 데이터를 바로 클라이언트에게 반환한다. 이를 Cache Hit라고 한다.
하지만 캐시 서버에 데이터가 없다면 DB에 요청하여 원하는 데이터를 조회한 후, 해당 데이터를 클라이언트에게 제공하는데 이를 Cache Miss라고 한다. (캐시는 저장공간이 작기 때문에 지속적으로 Cache Miss가 발생할 경우, 캐시 전략에 따라 저장중인 데이터를 변경해야 한다.)
일반적으로 이와 같은 flow로 동작하는데, 어떻게 캐시를 사용하느냐에 따라 look aside cache(Lazy loading) 와 wirte back 으로 나뉜다.
Look Aside Cache (Lazy Loading)
- 캐시에 데이터 존재 유무 확인
- 데이터가 있다면 캐시의 데이터 사용
- 데이터가 없다면 실제 DB나 서버에 접근하여 사용
- DB 또는 서버에서 불러온 데이터를 캐시에 저장
look aside cache는 캐시에 한번 접근하여 데이터가 있는지 판단 후, 있다면 캐시의 데이터를 사용하고 없다면 실제 DB 또는 API를 호출한다. cache를 사용한 대부분의 개발은 해당 프로세스를 따르고 있다.
Write back
- 모든 데이터를 캐시에 저장
- 캐시에 모여있는 데이터를 일정 주기마다 DB에 한꺼번에 저장 (배치)
- DB에 저장한 데이터를 캐시에서 삭제
write back은 데이터를 cache에 모으고 일정한 주기 또는 일정한 크기가 되면 한번에 처리하는 방식이다.
write back은 주로 쓰기 작업이 많을 때, INSERT 쿼리를 일일이 날리지 않고 한꺼번에 배치 처리하기위해 사용한다. 예를 들어 영어 듣기 평가를 온라인으로 진행하는 서비스가 있을 때, 여러 학생이 동시에 제출 버튼을 누르면서 DB에 갑작스럽게 엄청난 INSERT 쓰기 요청이 몰리게 되면 DB 서버가 죽을 수도 있다. 이 때 write back 기반의 캐시를 사용하면 캐시 메모리에 데이터를 저장해놓고, 이후 DB 디스크에 업데이트 해주면 안전하게 쓰기 작업을 수행할 수 있다.
DB에서 디스크를 접근하는 횟수가 줄어들기 때문에 성능향상을 기대할 수 있지만, DB에 저장하기 전 캐시 서버가 죽으면 데이터가 유실될 수도 있는 위험이 있다.
👉 Cache 의 장단점
장점
- 캐시에 데이터를 미리 복사해 놓으면, 계산이나 접근없이 더 빠른속도로 데이터에 접근할 수 있음
단점
- 비싸다.
- 가격 때문에 캐시는 많이 쓸수가 없다. 그래서 캐시에 저장할 적은 양의 정보를 잘 선택하는 것도 중요하다.
👉 Cache 에는 어떤 정보를 담아야 할까 ?
앞서 말했듯이 모든 데이터를 캐시에 담기에 캐시라는 저장공간은 작고 값이 비싸다. 그렇기 때문에 파레토의 법칙에 해당하는 소수의 데이터를 '잘' 선별해야 한다. 이 때 사용되는 것이 지역성이다.
시간적 지역성
- 한번 접근한 특정 데이터가, 가까운 미래에 또 한번 데이터에 접근할 가능성이 높은 경우
- 메모리 상의 같은 주소에 여러 차례 쓰기를 수행하는 경우
- 상대적으로 작은 캐시를 사용해도 효율성을 높일 수 있다.
공간적 지역성
- 특정 데이터와 가까운 주소가 순차적으로 접근된 경우
- CPU 캐시, 디스크 캐시의 경우 한 메모리 주소에 접근시, 그 주소 뿐만이 아니라 해당 블록을 전부 캐시로 가져옴
- 이 때, 메모리 주소를 오름차순이나 내림차순으로 접근한다면, 캐시에 이미 저장된 같은 블록의 데이터에 접근하게 됨(캐시의 효율성 향상)
순차 지역성
- 데이터가 순차적으로 엑세는 되는 경향을 보인다.
- 프로그램 내 명령어가 순차적으로 구성
👉 Local Cache vs Global Cache
Local Cache
- Local 장비 내에서만 사용되는 캐시로, Local 장비의 자원을 사용한다.
- Local에서만 작동하기 때문에 속도가 빠르다.
- 다른 서버와의 데이터 공유가 어렵다.
Global Cache
- 여러 서버에서 Cache에 접근하여 사용하는 캐시로 분산된 서버에서 데이터를 저장하고 조회 가능하다.
- 네트워크를 통해 데이터를 가져오므로 Local Cache에 비해서는 상대적으로 느리다.
- 별도의 Cache 서버를 이용하기 때문에 서버 간 데이터 공유가 쉽다.
'CS' 카테고리의 다른 글
[CS/JAVA] JVM이란? (0) | 2023.08.23 |
---|---|
[CS] Blocking/Non-blocking , Sync/Async (1) | 2023.05.11 |
[DB] 트랜잭션(Transaction)이란? ACID, COMMIT, ROLLBACK (0) | 2023.05.09 |
[DB] JOIN문, JOIN의 종류 : INNER, OUTER, CROSS, SELF (0) | 2023.04.29 |
[DB] SQL vs NoSQL (0) | 2023.03.10 |