달력

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
  •  
  •  

<zmlen><len>"foo"<len><free>"bar"<len>"hello"<len><free>"world"

위의 모습은 foo : bar,   hello : world 를 입력했을때 zipmap에 저장된 구조입니다.
zmlen은 zipmap 의 실제 크기입니다. 1 byte를 사용하고,
            크기가 254보다 크거나 같으면, 사용하지 않습니다. 
len은 1 byte 또는 5 byte를 사용합니다.    데이타의 길이가 0~252라면 1 byte가 사용되고, 
         253이면 다음 4 byte가 data의 길이가 됩니다. 255는 데이타의 끝을 나타냅니다.
free는 수정후, 사용안한 byte의 크기를 나타냅니다.
          unsigned int형으로 8 bit입니다. 만약 8 bit가 넘는다면 zipmap 을 resize하게 됩니다.


zmlen len key len free value len key len free value len(ZIPMAP_END)   이런구조가 되겠죠?

여기까지가 주석에 나온 부분이고, 소스를 보면서 zipmap에 대해 알아봅시다.

제일 처음 볼 함수는 zipmapSet 입니다.

zipmapRequiredLength 에서 key,value가 필요한 총 byte를 구해줍니다.
(len * 2, free 의 총합, key/value의 len이 254가 넘는다면 4씩 더해줍니다.)

1. key 와 같은 부분을 찾고, 없으면 NULL return   zipmapLookupRaw
2. NULL이면 현재 필요한 길이(len + key + len + free + value)만큼 resize를 해주고,
3. NULL이 아니면  입력할 data의 길이(reqlen)와 현재 set되어있는 길이(freelen)를 구하고,
4. reqlen > freelen 이라면 그 차이만큼 map size를 늘리고,
5. freelen - reqlen >= 4 라면 그 차이만큼 map size를 줄인다.

4, 5에 대한 것을 그림으로 보자면 아래와 같습니다.


 그외 몇가지 함수를 살펴보면 zipmap에서 iterator역할을 해주는 zipmapNext,
입력한 key에 해당 구간을 삭제해주는 zipmapDel
입력한 key의 value를 찾아주는  zipmapGet 가 있습니다.

zipmap 크기 조절 해주는거랑 zipmapLookupRaw  를 이해하니 나머지는 술술 잘 풀렸습니다.
zmlen Size 관련 issue : https://github.com/antirez/redis/issues/188  

hashtable은 dict자료구조를 사용합니다. : )  (좋구먼~~ ㅎㅎ)


 t_hash.c에서 zipmap과 hash 를 쓰지않고, ziplist와 hash를 씁니다.
why? https://github.com/antirez/redis/issues/188 ,  https://github.com/antirez/redis/pull/285

ziplist에 값을 넣을때 key, value로 tail에 두개씩 insert하고, 삭제할때도, key, value삭제를 합니다.
ziplist와 마찬가지로 제한을 두었습니다.

# Hashes are encoded using a memory efficient data structure when they have a
# small number of entries, and the biggest entry does not exceed a given
# threshold. These thresholds can be configured using the following directives.
hash-max-ziplist-entries 512
hash-max-ziplist-value 64

정작 사용하는곳은 rdb.c이네요.

이상 Hash data type을 마치겠습니다.


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