Cache

Eddy📱·2022년 8월 4일
0

Swift

목록 보기
4/11
post-thumbnail

캐시란 무엇일까?

캐시는 다음과 같이 이야기할 수 있다

  • 데이터나 값을 미리 복사해 놓는 임시 저장소
  • 자원을 절약하고 성능 향상을 위해 자주 사용하는 데이터를 임시저장하여 재사용할 수 있는 곳

캐시의 저장소

  • RAM 메모리 (메모리 영역의 일부분을 사용)
  • Disk (파일 형태로 디스크에 저장)

RAM에서 메모리 영역을 일부 사용하기도 하고 Disk에서 파일 형태로도 저장하고 있다.

NSCache란?

임시적으로 key-value의 값들을 저장하고 있는 곳으로 만약 가지고 있는 데이터들이 많아지게 되면 사라질 수 있다.

NSCache의 용도

iOS에서 메모리 캐싱할 떄 사용한다.

Cache 규칙

Cache에는 여러 개의 규칙들이 있다.

  • NSCache에는 안에 있는 데이터를 자동적으로 내보내는 정책들이 있다. 이는 시스템의 메모리를 캐시가 많이 사용하지 않게 하기위해서다. 만약 메모리에서 다른 applications들을 요구하게 된다면 이 정책들은 캐시로부터 다른 데이터들을 제거하고 메모리를 최소화한다.
  • 캐시 자체를 lock하는 것 없이 다른 쓰레드로부터 캐시에 있는 아이템을 추가, 제거 등을 할 수 있다.
  • NSMutableDictionary 객체와 달리 캐시는 객체들을 복사하지 않는다.

대부분 NSCache 객체를 활용해서 임시적으로 객체들을 저장하고 있는다.
이렇게 객체들을 저장하고 있다가 필요할 때 재사용하는 것은 성능적으로 좋다.
이건 당연한 것인데, 일일이 다시 찾아서 실행시키는 것보다 캐시에 있는것을 바로 사용하면 되기떄문이다.
그러나 만약 중요하지 않고 메모리가 꽉차게 되면 이는 제거될 수 있다. 그래서 제거가 된다면 캐시가 없는 것처럼 다시 계산해서 실행해야한다.

여러 요소들을 가진 객체가 장기간 사용되지 않는다면 NSDiscardableContent protocol에 의해서 제거된다. 기본적으로 만약 내용이 사라지게 되면 기본적으로 캐시에서도 제거된다.

NSDiscrdableContent는 객체의 라이프 사이클이 존재하여 'counter' 변수에 의해 변하게 된다. 그래서 만약 메모리에서 이것을 읽고 있거나 여전히 필요하다면 counter 변수는 1이거나 1이상이 된다. 그리고 만약 사용되지 않으면 0이 된다. 그러면 캐시에서도 제거된다.

캐시 운용정책

  • 얼마나 자주 사용되는지, 언제 삭제가 되어야할지
  • 데이터의 identifier 정의 (수정 여부)
  • Expiration 설정
  • 메모리 저장할지, 디스크에 저장할지 결정

URLCache의 기본 캐시 정책

여기에서 볼수 있다!

저장 원칙으로 Enum에는 3가지가 존재한다

  • allowed
  • allowedInMemoryOnly
  • notAllowed

allowed는 제한없이 URLCache에 저장하는 것을 허락하고 있다.

allowedInMemoryOnly는 저장을 허락하지만 메모리가 허락하는 제한내에서만 저장을 허락하고 있다.

notAllowed는 어떤 경우에도 메모리나 디스크에 저장하는 것을 허락하지 않는다.

만약 라이브러리에서 on disk cache를 지원한다면, 캐시를 저장하는 디스크 영역은?

디스크 캐싱을 지원하는 라이브러리는 Kingfisher이며 만약사용자가 직접 Path를 입력하지 않는다면 Library/Caches 디렉터리에 저장된다.

이는 아래에서 확인할 수 있다.

DiskStorage.swift line 569 ~ 586

extension DiskStorage {
  struct Creation {
    let directoryURL: URL
    let cacheName: String

    init(_ config: Config) {
      let url: URL
      if let directory = config.directory {
          url = directory
      } else {
          url = config.fileManager.urls(for: .cachesDirectory, in: .userDomainMask)[0]
      }
        
      cacheName = "com.onevcat.Kingfisher.ImageCache.\(config.name)"
      directoryURL = config.cachePathBlock(url, cacheName)
    }
  }
}

클라이언트와 서버 캐시 차이점

클라이언트

클라이언트의 local에 저장되며 서버로부터 받는 응답을 저장하는 용도로 사용한다.

서버

서버의 부하를 줄이거나 클라이언트의 요청에 신속히 응답할 수 있도록 서버에 자주 들어오는 요청들을 캐시에 저장해둔다.

AlamofireImage 라이브러리와 Kingfisher 라이브러리의 캐시 정책의 차이점

Kingfisher

  • url 전체를 캐시 키로 사용한다.
  • Multiple-layer hybrid cache로 메모리 캐시와 디스크 캐시 모두 사용한다.
  • Expire 정책이 있음

AlamofireImage

  • URLCache (애플 기본 클래스) 와 AutoPurgingImageCache (Dictionary) 를 사용한다.
  • LRU 방식으로 캐시 관리
  • Expire 정책이 없음

참고 사이트

https://developer.apple.com/documentation/foundation/nscache
https://developer.apple.com/documentation/foundation/nsdiscardablecontent

profile
Make a better world

0개의 댓글