Redis HASH Table of  HASHES

<< ZIP List of HASHES HASH Table of KEYS >>

HASH TABLE   Fields Management

Parameters

Zip list에서 설명한 것처럼 Hashes는 내부적으로 두 가지 데이터 타입을 사용한다.   redis.conf에 있는 이 두 파라미터가 데이터 타입을 결정한다.
entries는 필드 개수이고 value는 값의 바이트 수이다.   두 가지 중 하나라도 크면(초과하면) 해시 테이블로 변경된다.

    hash-max-ziplist-entries 512
    hash-max-ziplist-value 64

Data Structures

Hash table

data structure hash table hashes
    그림 1-1   Data structure Hash table of Hashes

A 부분은 키를 관리하는 해시 테이블이고, robj value는 Hashes를 관리하는 해시 테이블 B 부분을 가리킨다.   B 부분 해시 테이블이 필드와 값을 저장하는 곳이다.
그러므로 Hashes 관련 명령이 수행되려면 키를 찾기 위해서 한번, 필드와 값을 찾기 위해서 또 한번, 이렇게 두 번 해시 테이블을 검색한다.

Functions

HSET Command

hset command functions hash table of hashes
    그림 1-2   HSET functions Hash table of Hashes

hset command는 주요한 세 개의 function 중 hashTypeLookupWriteOrCreate()와 hashTypeTryConversion()은 Zip list of Hashes에서 설명한 것과 같다.
간단히 설명하면, hashTypeLookupWriteOrCreate()는 키를 찾아 있으면 robj value를 리턴하고, 없으면 Zip list, robj, dictEntry를 생성한다.
hashTypeTryConversion()는 현재 encoding이 Zip list 일 때 value의 바이트 수를 검사해서 server.hash_max_ziplist_value 보다 크면 Hash table로 변환한다.
hashTypeSet()에서 server.hash_max_ziplist_entries(필드 개수) 검사해서 이 값보다 크면 hashTypeConvert(HT)를 호출해서 짚 리스트를 해시 테이블로 변환하는 부분은 Zip list 부분과 같다.
이제 부 터 Zip list와 다른 Hash table에서 어떻게 저장하는지 알아보자.


  • hashTypeSet()
    • Encoding이 Hash table이면 dictReplace()를 호출한다.
    • dictReplace()는 dictAdd(dictEntry)를 호출해서 신규 저장이 성공하면 리턴한다.   이미 필드가 있으면 다음 부분이 수행된다.
    • dictFind(field)가 수행되어 필드를 찾는다.
    • dictSetVal(value)가 수행되어 값을 넣는다.

HGET Command

hget command functions hash table of hashes
    그림 1-3   HGET functions Hash table of Hashes

이제 필드 값을 가져오는 HGET command가 해시 테이블에서 어떻게 값을 가져오는지를 설명한다.

  • lookupKeyReadOrReply()를 호출해서 키가 있는지 확인한다.   키 확인은 lookupKey()를 거쳐 dictFind()로 키를 찾고, dictGetVal()로 robj value를 구한다.   이 부분은 Zip list에서 설명한 것과 같다.
  • addHashFieldToReply()에서 encoding이 REDIS_ENCODING_ZIPLIST이면 hashTypeGetFromZiplist()를 호출하고, REDIS_ENCODING_HT 이면 hashTypeGetFromHashTable()를 호출한다.
  • hashTypeGetFromHashTable()은 dictFind(field)를 호출해서 필드를 찾고, dictGetVal()로 값을 가져온다.
  • 그러므로 HGET 명령은 키를 관리하는 해시 테이블에서 한 번 찾고, Hashes를 관리하는 해시 테이블에서 또 한 번 찾아서, 총 두 번 해시 테이블을 탐색한다.


<< ZIP List of HASHES HASH Table of HASHES HASH Table of KEYS >>

질문하거나 댓글을 보려면 클릭하세요.  댓글수 :    조회수 :

Email 返事がかかってなれば、メールでお知らせします。