Cache

짱구·2023년 1월 27일
2

redis

목록 보기
7/8

캐시란?

  • 성능 향상을 위해 값을 복사해놓는 임시 기억 장치

    • 네트워크 지연감소
    • 서버 리소스 사용 감소
    • 병목현상 감소
  • 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): 먼저 들어온 데이터를 삭제

Spring에서 캐시 이용하기

  • Spring Cache 추상화
    • 스프링에서는 CacheManger를 통해 캐시 인터페이스를 구현 (다양한 캐시 구현체가 존재)
    • 메서드에 Annotation을 사용하여 캐시를 쉽게 적용 가능

종류

  • @Cacheable
    • method에 cache를 적용 (Cache-Aside 패턴 수행)
  • @CachePut
    • method의 return 값을 캐시에 설정
  • @CacheEvict
    • method의 키값을 기반으로 캐시를 삭제

적용

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

profile
코드를 거의 아트의 경지로 끌어올려서 내가 코드고 코드가 나인 물아일체의 경지

2개의 댓글

comment-user-thumbnail
2023년 1월 27일

어쩔티비

답글 달기
comment-user-thumbnail
2023년 1월 27일

좋은 정보 감사합니다

답글 달기