성능 향상을 위해 값을 복사해놓는 임시 기억 장치
Cache에 복사본을 저장해놓고 읽음으로서 네트워크나 장치에 접근 횟수를 줄인다!
Cache의 데이터는 원본이 아니며 언제든 사라질 수 있다
- 캐시 적중(Cache Hit) : 캐시에 접근해 데이터를 발견함
- 캐시 미스(Cache Mist) : 캐시에 접근했으나 데이터를 발견하지 못함
- 캐시 삭제 정책(Eviction Policy) : 캐시의 데이터 공간 확보를 위해 저장된 데이터를 삭제
- 캐시 전략 : 환경에 따라 적합한 캐시 운영 방식을 선택할 수 있음
- Cache-Aside (Lazy Loading) , Write-Through, Write-Back
Cache-Aside (Lazy Loading) -일반적으로 많이 쓰임
- 항상 캐시를 먼저 체크하고 없으면 원본(ex: DB)에서 읽어온 후에 캐시에 저장함
- 장점 : 필요한 데이터만 캐시에 저장되고, Cache Miss가 있어도 치명적이지 않음
- 단점 : 최초 접근은 느림, 업데이트 주기가 일정하지 않기 때문에 캐시가 최신 데이터가 아닐 수 있음 (캐시 데이터는 x초 후 지워지게 하는 방식으로 커버를 하기도 한다.)
Write-Through
- 데이터를 write 할 때 항상 캐시를 업데이트하여최신 상태를 유지함 (조회가 많을 때 효율↑)
- 장점: 캐시가 항상 동기화되어 있어 데이터가 최신
- 단점: 자주 사용하지 않는 데이터도 캐시되고, 쓰기 지연시간이 증가 (변경 할 때마다 캐시도 변경을 계속 해야하기 때문)
Write-Back
- 데이터를 캐시에만 쓰고, 캐시의 데이터를 일정 주기로 DB에 업데이트 (write가 많을 때 효율↑)
- 장점: 쓰기가 많은 경우 DB 부하를 줄일 수 있음
- 단점: 캐시가 DB에 쓰기 전에 장애가 생기면 데이터 유실 가능
- 로그 데이터와 같이 휘발이 되어도 큰 이상이 없는 데이터를 넣자!
- Expiration: 각 데이터에 TTL(Time-To-Live)을 설정해 시간 기반으로 자동 삭제
- 데이터를 캐시에 넣을 때 유효시간을 등록해놓는다.
Eviction Algorithm: 공간을 확보해야 할 경우 어떤 데이터를 삭제할지 결정하는 방식
ex) 데이터가 캐시에 꽉 차있어 새로운 데이터를 넣을 수 없을 때
- LRU(Least Recently Used): 가장 오랫동안 사용되지 않은 데이터를 삭제
- LFU(Least Frequently Used): 가장 적게 사용된 데이터를 삭제(최근에 사용되었더라도)
- FIFO(First In First Out): 먼저 들어온 데이터를 삭제
yml
spring: cache: type: redis
BootStarter
//@EnableCaching을 사용하여 캐시를 사용한다고 알림! @EnableCaching @SpringBootApplication public class RedisApplication { }
Method
//cacheNames은 마음대로, key는 어떤 값을 캐싱처리 할 것인지 명시 @Cacheable(cacheNames = "userAgeCache", key = "#userId") public int getUserAge(String userId){
- getUserAge method 호출 시 redis userAgeCache 변수에 userId 값이 있는지 확인
-> 없다면 redis에 userAgeCache 변수를 만들고 userId 값을 저장
-> 있다면 uesrAgeCache 안에 userId 값을 반환
출처 및 링크 : fastcampus
어쩔티비