ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Maxmemory policy
    개발하면서/코드보면서 2012.06.17 22:37

    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에 지우라는 기록을 남기게 합니다.

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


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

    TAG

    댓글 3

    • 두두리이 2013.12.31 17:32 신고

      좋은 글 감사합니다. 읽다가 궁금한 점이 있어서 질문 드립니다. ㅎㅎ
      #1.
      /* Redis maxmemory strategies */ 는 언제 선택하나요 build 할때 인자로 넘겨서 선택할 것 같은데
      이후에 변경할 수 있나요? conf에 있나요?

      #2.
      expire 시간이 만료되기 전에
      TTL과 LRU 정책에 의해 데이터가 없어질 수 있다는 이야기 인가요?

      #3.
      그럼 ALLKEYS_ 에서는 expire 값이 없는 key 들도 LRU 와 RANDOM에 의해 데이터를 잃을 수 있는 건가요?

      #4.
      redis에서 설정된 max memory를 초과 하는 경우
      기존 데이터를 보존하고 추가로 저장되는 set 등을 무시한다고 알고 있었는데
      #2,#3 에 의하면 기존 데이터가 날아가고 새로운 set command가 실행되지 않나요?
      제가 잘 못 알고 있었던것 같기도 하고요.

    • 두두리이 2013.12.31 17:45 신고

      자답으로 #1 은 conf 파일에서도 설정 가능하고
      config get maxmemory-policy
      config set maxmemory-policy [volatile-ttl|volatile-lru] 등과 같은 방식으로 설정 되네요.

      #2, #3
      "volatile-lru" 으로 policy를 설정하면
      expire 없는 key는 삭제되지 않고
      expire가 있는 key는 해당 시간이 만료되지 않아도 삭제가 되는군요

      #4.
      (error) OOM command not allowed when used memory > 'maxmemory'.
      라는 에러가 나면서 set이 되지 않네요

      • 오산돌구 2014.01.02 13:26 신고

        #4에서 무조건 set이 안되는건 아니고 conf에서 설정한 maxmemory_policy에 맞게 지울 키를 찾아보고
        정상적으로 지워서 여유메모리가 생기면 set 이 되고, 못 찾거나, 지우지 못하면 말씀하신 에러가 발생하고있네요.
        redis.c freeMemoryIfNeeded함수에서 if(bestkey)... 이부분이요

        관심 감사합니다. : )

Designed by Tistory.