달력

112017  이전 다음

  •  
  •  
  •  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  •  
  •  

http://antirez.com/post/redis-as-LRU-cache.html


http://eli.thegreenplace.net/2009/10/30/handling-out-of-memory-conditions-in-c/


위 두개의 글을 참고한다음에 소스를 보면 더 이해가 쉽습니다. 

(저는 영어가 짧아 굵은글씨만 읽고 바로 소스로;;; 으헝헝~~)


Redis는 메모리 기반 key-value시스템입니다. 메모리는 한정되어있기때문에 무한정 데이타를 저장할수가 없죠.

그래서 Redis에서 나름대로 몇가지 방법을 만들었습니다.




소스를 보면서 하나씩 알아보도록 해요.

server가 가동되고 client가 접속을 하면 아래와 흐름으로 처리가 됩니다. 


으헉 많이도 거치네요. 자세한건 network(select, kqueue, epoll) 살펴볼때 알아보겠습니다. 여기서는 freeMemoryIfNeeded 함수에 대해 알면 되겠네요~~ : )


사전에 있는 데이타를 정리하기전에, AOF와 slave의 buffer들을 정리해줍니다.(AOF, Network 빨리봐야겠네요...)


while(mem_freed < mem_tofree){ } 에서 어떤일을 하는지 알아보겠습니다.


REDIS_MAXMEMORY_ALLKEYS_LRU, REDIS_MAXMEMORY_ALLKEYS_RANDOM인 경우는 실제 dict를

그 외에는 expires를 선택합니다.


Random Policy는 간단하게 dictGetRandomKey 함수로 key를 고르고,


LRU Policy는 maxmemory_samples 갯수 만큼 random하게 키를 고르고 그 키의 value의 시간을 잽니다.

그래서 가장 오래된 key를 bestkey로 선택합니다.


TTL Policy는 expire에 있는 key중에 maxmemory_samples 갯수만큼 임의로 골라서

그 키의 value(expire한 값)를 비교해서 가장 작은값을 bestkey로 선택합니다.


마지막으로 하는 일은, slave에게 bestkey를 삭제하라는 명령과 aof에 지우라는 기록을 남기게 합니다.

그리고 실제 지워진 메모리를 계산을 합니다.


이 동작을 확보하고자 하는 메모리가 될때까지 반복합니다.

저작자 표시 비영리
신고
Posted by 오산돌구
TAG