[입 개발] Cache에서의 Eviction, Expiration, Passivation

Cache를 공부하다 보면 다음과 같은 개념들을 만날 수 있습니다. Eviction 과 Expiration. 이게 비슷한 행동을 하고, 비슷한 내용으로 보이는 케이스가 있지만, 사실상 완전히 다른 개념입니다. 넵, 저도 맨날 오해하고 있지만… 그래서 여기에 대해서 간단하게 적어보려고 합니다.

캐시 서버는 속도를 위해서 대부분 메모리를 사용합니다. 디스크를 써도 마찬가지겠지만, 메모리를 쓰면 더더욱 용량이 모자라기 때문에, 이 공간을 어떻게 써야 하는지에 대해서 문제가 발생하게 됩니다. 하지만, 어떻게 아끼든 결국 스토리지의 한계는 오기 마련이고, 이제, 데이터 공간을 확보하기 위해서 무엇을 해야할까요?

넵, 정답은, 안쓰는 데이터를 지우는 겁니다. 뭐, 이걸 지우는 전략은 여러가지가 있을 수 있지만, 일반적으로는 LRU를 많이 사용합니다. 다른 전략들 역시 검색해보면 다 나옵니다. 이렇게, 공간이 필요할 때, 어떤 데이터를 지우는 것을 Eviction 이라고 합니다.

그럼 Expiration은 뭘까요? 넵, 말 그대로 유통기한이 있는겁니다. 특정 값에 Expiration을 걸어두면, 어떻게든 나중에 해당 시간이 지나면, 해당 값이 없어지는 겁니다. 사실 그래서 Eviction 을 Expiration을 이용해서 구현하기도 합니다. 즉, 이 데이터가 하루 지나면 필요없는 데이터다 싶으면 Expiration을 1 Day로 설정하는 겁니다.

그런데, 이 두개의 개념에는 어마어마한 차이가 있습니다. 그것은 Eviction 은 사용자가 명시적으로 의도하지 않은 동작인 것이고, Expiration은 사용자가 이 녀석을 지우겠다라고 명시적으로 의도한 것이라는 것입니다. 뭐, 둘다 지워지는 건 마찬가지다라고 하더라도, 이 두 개념의 차이에 대해서 아는 것은 매우 중요합니다.(정말?) 실제로 캐시 내부에서도 이 두 개의 삭제처리는 보통 다른 형태로 구현이 됩니다.

즉 Expiration은 실제 읽을 때 시간이 지났으면 삭제가 가능하지만, Eviction은 메모리가 모자라서 수행되므로, 항상 작업 전에 수행이되어야 합니다.

마지막으로 Passivation 은 뭐냐, 저도 잘 모릅니다만 ㅋㅋㅋ Infinispan에서 지원한다고 합니다. 메모리에서 삭제되었을때, 이게 디스크에 읽어들이는 것보다, 연산시간이 많이 걸리거나 할때, 실제로 메모리에서 바로 지우지 않고 Eviction 되는 값을 디스크등의 다른 스토리지에 저장하는 것입니다. 뭐, 이런 개념들이 있으니, 한번씩 곰곰히 집고 넘어가면 좋을듯 합니다.