캐시는 다음과 같이 이야기할 수 있다
RAM에서 메모리 영역을 일부 사용하기도 하고 Disk에서 파일 형태로도 저장하고 있다.
임시적으로 key-value의 값들을 저장하고 있는 곳으로 만약 가지고 있는 데이터들이 많아지게 되면 사라질 수 있다.
iOS에서 메모리 캐싱할 떄 사용한다.
Cache에는 여러 개의 규칙들이 있다.
대부분 NSCache 객체를 활용해서 임시적으로 객체들을 저장하고 있는다.
이렇게 객체들을 저장하고 있다가 필요할 때 재사용하는 것은 성능적으로 좋다.
이건 당연한 것인데, 일일이 다시 찾아서 실행시키는 것보다 캐시에 있는것을 바로 사용하면 되기떄문이다.
그러나 만약 중요하지 않고 메모리가 꽉차게 되면 이는 제거될 수 있다. 그래서 제거가 된다면 캐시가 없는 것처럼 다시 계산해서 실행해야한다.
여러 요소들을 가진 객체가 장기간 사용되지 않는다면 NSDiscardableContent protocol에 의해서 제거된다. 기본적으로 만약 내용이 사라지게 되면 기본적으로 캐시에서도 제거된다.
NSDiscrdableContent는 객체의 라이프 사이클이 존재하여 'counter' 변수에 의해 변하게 된다. 그래서 만약 메모리에서 이것을 읽고 있거나 여전히 필요하다면 counter 변수는 1이거나 1이상이 된다. 그리고 만약 사용되지 않으면 0이 된다. 그러면 캐시에서도 제거된다.
여기에서 볼수 있다!
저장 원칙으로 Enum에는 3가지가 존재한다
allowed는 제한없이 URLCache에 저장하는 것을 허락하고 있다.
allowedInMemoryOnly는 저장을 허락하지만 메모리가 허락하는 제한내에서만 저장을 허락하고 있다.
notAllowed는 어떤 경우에도 메모리나 디스크에 저장하는 것을 허락하지 않는다.
디스크 캐싱을 지원하는 라이브러리는 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에 저장되며 서버로부터 받는 응답을 저장하는 용도로 사용한다.
서버
서버의 부하를 줄이거나 클라이언트의 요청에 신속히 응답할 수 있도록 서버에 자주 들어오는 요청들을 캐시에 저장해둔다.
참고 사이트
https://developer.apple.com/documentation/foundation/nscache
https://developer.apple.com/documentation/foundation/nsdiscardablecontent