이 문서는 2022년 11월 22일에 @sumin-dev에 의해서 작성되었습니다.
1. 캐시의 동작 원리
1.1. 캐시의 종류
1.2. 캐시 히트와 캐시 미스
1.3. 캐시의 동작 방식
2. 캐싱 전략(Caching Strategies)
2.1. Look-Aside (Lazy Loading)
2.2. Read Through
2.3. Write Through
2.4. Write Back (Write Behind)
2.5. Write Around
-
시스템에 장착된 캐시의 용량과 성능이 점점 증가하면서 캐시의 캐시로 사용되는 메모리가 추가됨
-
▶ 이것을 적용된 순서대로 L(Level) 1, L2, L3 (1차 캐시, 2차 캐시, 3차 캐시 메모리)
- L1캐시는 CPU와 가장 가까운 캐시. 가장 고성능이자 고가인 작은 용량의 집적회로가 사용
- L1 캐시 메모리에는 속도를 위해 명령어 캐시와 데이터 캐시가 따로 존재
- IC(Instruction Cache) : 메모리에서 text 영역의 데이터를 다루는 캐시
- DC(Data Cache) : 메모리에서 text 영역을 제외한 데이터를 다루는 캐시
- 명령어는 보통 공간 지역성이 높고, 데이터는 시간 지역성이 높아 둘을 나누어 서로 다른 지역성을 이용
- L2는 L1 캐시에서 데이터를 퍼가기 위한 캐시로 사용하기 위해 그보다는 용량이 크지만 약간 더 느린 저장공간
- 명령어 캐시와 데이터 캐시의 구분 없이 하나의 캐시 메모리로 구성
-
예시1) ARM Cortext -A72 CPU : 프로세서가 단독으로 사용하는 L1 캐시, 모든 프로세서가 공유하는 L2 캐시
- CPU가 데이터를 요청하여 캐시 메모리에 접근했을 때, 캐시 메모리가 해당 데이터를 가지고 있다면 캐시 적중(cache hit), 해당 데이터가 없어서 메인 메모리에서 가져와야 한다면 캐시 부적중(cache miss)
- 캐시 미스의 종류
- cold miss : 해당 메모리 주소를 처음 불렀기 때문에 나는 미스
- conflict miss : A 데이터와 B 데이터가 캐시 메모리에서 같은 주소에 할당되어 나는 미스
- capacity miss : 캐시 메모리에 공간이 부족해서 나는 미스
- 캐시 미스의 종류
- 캐시 히트의 정도를 나타내는 지표인 캐시 적중률(cache hit ratio) 에 의해 캐시 메모리의 성능 결정
- 원본 데이터와는 별개로 자주 쓰이는 데이터(Hot Data)들을 복사해둘 캐시 공간 마련
- 데이터 요청이 들어오면 원본 데이터가 담긴 곳에 접근하기 전 먼저 캐시 내부부터 탐색
- 캐시에 원하는 데이터가 없거나(cache miss), 너무 오래되어 최신성을 잃었을 때(expiration)
- 원본 데이터가 있는 곳에 접근해 데이터를 가져옴
- 이 때 데이터를 가져오며 캐시에도 해당 데이터를 복사하거나 갱신
- 캐시에 원하는 데이터가 있을 때(cache hit)
- 원본 데이터가 있는 공간에 접근하지 않고 바로 해당 데이터 제공
- 캐시 공간은 작기 때문에 공간이 모자라면 안쓰는 데이터부터 삭제하여 공간 확보(Eviction)
캐시는 운영체제 뿐만 아니라 웹 애플리케이션 및 데이터베이스를 비롯한 다양한 기술 계층에 걸쳐 활용
캐싱을 통해 이루고자 하는 목적과 기본적인 원리는 차이가 없습니다~!
그래서 Redis cache를 이용한 캐싱 전략이 잘 소개되어 있어 가져왔습니다!
Application을 CPU, Database를 메인메모리, Redis를 캐시메모리로 이해해주시면 감사👍
- 데이터를 찾을 때 우선 캐시에서 데이터를 찾고 데이터가 있다면 캐시에서 데이터를 가지고 오는 전략
- 만약 캐시에 데이터가 없어 cache miss가 발생하면 앱은 DB에서 데이터를 가져온 뒤 캐시에 넣어주는 작업
- DB에 직접 조회해서 입력되기 때문에 Lazy Loading
- 장점) 캐시가 다운되더라도 DB에서 데이터를 가지고 올 수 있음
- 단점) cache miss로 인해 많은 프로세스가 DB에 접근하기 때문에 DB 부하 발생
- 캐시에서만 데이터를 읽어오는 전략
- cache miss가 발생하면 캐시는 DB에서 데이터를 검색하고 캐시에 자체 업데이트한 뒤 앱에 데이터를 보냄
- 데이터를 저장할 때 먼저 캐시에 저장한 다음 DB에 저장하는 방식
- 장점) 캐시는 항상 최신 정보를 가지고 있음
- 단점1) 저장할 때마다 두 단계를 거쳐야하므로 상대적으로 느림
- 단점2) 저장하는 데이터가 재사용되지 않을 수도 있는데 무조건 캐시에 넣기 때문에 리소스 낭비 발생
- 이를 방지하기 위해 캐시에 Expire time 설정
- 먼저 캐시에 데이터를 저장했다가 특정 시점마다 DB에 저장하는 방식
- 장점) 캐시에 데이터를 모았다가 한 번에 DB에 저장하므로 쓰기 비용을 절약
- 단점) 데이터를 옮기기 전에 캐시 장애가 발생하면 데이터 유실이 발생
- 모든 데이터는 DB에 저장되고 읽은 데이터만 캐시에 저장되는 방식
- cache miss가 발생하는 경우에만 캐시에 데이터를 저장하기 때문에 캐시와 DB 내의 데이터가 다를 수 있음
- 주로 Look aside, Read through와 결합해서 사용