어떻게 가까이 두고 빨리 쓰기, 캐시
자주 보는 책을 볼 때마다 먼 창고까지 가서 꺼내 온다고 하자. 오갈 때마다 한참 걸린다. 그 책 한 권을 책상 위에 복사해 두면 다음부터는 손만 뻗으면 된다. 자주 쓰는 데이터를 가까운 곳에 사본으로 두고 빠르게 꺼내는 방법, 이것이 캐시예요.
먼 창고는 오가기 느려요
앞 레슨에서는 데이터를 안전하게 바꾸는 법을 봤다. 이번에는 읽는 쪽이다. 데이터베이스는 보통 디스크에 데이터를 두거나 다른 컴퓨터에서 돌아가서, 꺼내 오려면 요청을 보내고 답을 기다려야 한다.
이 왕복은 생각보다 길다. 같은 데이터를 다시 볼 때도 처음과 똑같이 먼 길을 다녀와야 해요. 아래에서 먼 창고에 몇 번 다녀와 보자.
데이터를 눌러 먼 창고에서 꺼내 보자. 길이 길어서 한 번 오가는 데 한참 걸리고, 다시 눌러도 똑같이 느려요.
한두 번이면 참을 만하다. 그런데 인기 있는 상품 정보처럼 같은 데이터를 하루에 수십만 번 찾는다면 그때마다 먼 길을 오가야 한다. 기다리는 시간도 쌓이고, 창고 쪽도 같은 질문에 끝없이 답하느라 바빠져요.
게다가 데이터 대부분은 아주 가끔 쓰이고, 일부만 유난히 자주 쓰인다. 방금 쓴 것을 곧 또 쓰는 일도 흔하다. 그렇다면 자주 쓰는 일부만 가까이 두면 되지 않을까?
가까이 사본을 한 부 둔다
방법은 간단하다. 자주 쓰는 데이터를 먼 창고에서 한 번 꺼내 온 뒤, 가까운 곳에 사본을 한 부 둔다. 이 가까운 보관함을 캐시라고 불러요.
캐시는 보통 창고보다 훨씬 빠르지만 그만큼 작다. 메모리는 디스크보다 빠르고, 같은 컴퓨터 안은 다른 컴퓨터보다 가깝다. 그래서 빠르고 작은 곳에 자주 쓰는 것만 골라 담는다.
항목을 눌러 가까운 캐시에 사본을 둬 보자. 비어 있던 캐시 칸이 하나씩 채워져요.
가까운 캐시에 사본이 생겼다. 이제 같은 데이터를 또 찾으면 먼 창고까지 갈 필요가 없다. 바로 옆 캐시에서 꺼내면 된다.
다만 찾는 것이 늘 캐시에 있으리라는 보장은 없어요. 캐시에 있을 때와 없을 때 하는 일이 달라지니, 두 경우를 나눠 보자.
적중과 빗나감
찾는 것이 캐시에 이미 있으면 짧은 길로 곧장 꺼낸다. 이것을 적중이라고 한다. 캐시에 없으면 어쩔 수 없이 먼 창고까지 다녀와야 하는데, 이것은 빗나감이라고 한다.
빗나갔을 때는 가져온 김에 사본을 캐시에 남겨 둬요. 그러면 같은 것을 다음에 찾을 때는 적중이 된다. 전체 요청 가운데 적중한 몫을 적중률이라 부르고, 캐시가 일을 얼마나 잘하는지 볼 때 이 값을 본다.
요청을 눌러 보자. 캐시에 있으면 짧은 길로 적중하고, 없으면 먼 길로 빗나간 뒤 사본을 캐시에 남겨요. 같은 요청을 두 번 누르면 차이가 보인다.
처음에는 빗나가서 느렸지만, 사본을 남긴 뒤로는 같은 요청이 적중해 빨라졌다. 자주 찾는 것일수록 적중이 늘어 평균 시간이 짧아져요.
캐시가 가득 차면 새 사본을 둘 자리를 만들려고 무언가를 내보내야 한다. 흔히 가장 오랫동안 쓰지 않은 것을 내보내는데, 이 규칙을 LRU라고 부른다. 방금 쓴 것은 곧 또 쓸 가능성이 크다는 생각에서 나온 규칙이다. 그런데 골치 아픈 문제가 하나 남아 있다. 먼 창고의 원본이 바뀌면 캐시의 사본은 어떻게 될까?
캐시가 옛것이 될 때
캐시는 사본일 뿐이다. 먼 창고의 원본이 바뀌어도 캐시는 그 사실을 모르고, 예전에 받아 둔 사본을 그대로 들고 있다.
그러면 적중은 빨라도 내주는 값이 옛것일 수 있어요. 이런 상태를 두고 캐시가 오래됐다고 한다. 빠른 대신 틀린 값을 내줄 위험, 이것이 캐시의 그늘이다.
원본을 눌러 값을 바꿔 보자. 캐시는 옛 값을 그대로 들고 있고, 캐시를 새로 채우거나 버리면 다시 원본과 맞아져요.
원본을 바꾸자 캐시가 어긋났다. 막는 방법은 크게 둘이다. 하나는 원본이 바뀔 때 캐시의 사본을 새 값으로 바꾸거나 지우는 것이고, 다른 하나는 사본에 유효 기간을 붙여 시간이 지나면 버리는 것이다.
버린 자리는 다음 빗나감 때 새 사본으로 다시 채워져요. 유효 기간을 짧게 잡으면 옛 값은 줄지만 빗나감이 늘고, 길게 잡으면 그 반대다. 어느 쪽이든 옛 값을 줄이면서 빠른 적중은 살리는 균형을 찾는 일이다.
정리
정리하면 이렇다. 먼 저장소는 오가는 길이 길어 느리니, 자주 쓰는 데이터는 가까이 사본을 둔다. 그것이 캐시다. 찾는 것이 캐시에 있으면 적중이라 빠르고, 없으면 빗나감이라 먼 곳까지 다녀온 뒤 사본을 남긴다.
캐시가 차면 오래 안 쓴 것부터 내보내고, 원본이 바뀌면 사본을 고치거나 버려서 옛 값을 막아요. 가까이 두고 빨리 쓰되 원본과 어긋나지 않게 챙기는 것, 이것이 캐시예요.
핵심을 차례로 눌러 되짚어 보자. (먼 곳은 느려요 → 가까이 사본 → 적중과 빗나감 → 원본 바뀌면 옛것)
캐시는 데이터베이스 앞에만 있지 않다. CPU에도, 웹 브라우저에도, 멀리 있는 서버의 내용을 사용자 가까운 곳에 복사해 두는 전송망에도 같은 생각이 들어 있어요.
가까이 두는 것만큼 작게 담는 것도 빠르기에 중요하다. 같은 내용을 더 적은 바이트로 담아 옮기는 방법을 다음 레슨 압축에서 다룬다.