ds_ht_hashes
Redis HASH Table of HASHES
레디스 내부구조 교육 |
레디스 정기점검/기술지원 Redis Technical Support |
레디스 엔터프라이즈 서버 Redis Enterprise Server |
---|
HASH TABLE Fields Management
Parameters
Zip list에서 설명한 것처럼 Hashes는 내부적으로 두 가지 데이터 타입을 사용한다.
redis.conf에 있는 이 두 파라미터가 데이터 타입을 결정한다.
entries는 필드 개수이고 value는 값의 바이트 수이다.
두 가지 중 하나라도 크면(초과하면) 해시 테이블로 변경된다.
hash-max-ziplist-value 64
Data Structures
Hash table
A 부분은 키를 관리하는 해시 테이블이고, robj value는 Hashes를 관리하는
해시 테이블 B 부분을 가리킨다.
B 부분 해시 테이블이 필드와 값을 저장하는 곳이다.
그러므로 Hashes 관련 명령이 수행되려면 키를 찾기 위해서 한번,
필드와 값을 찾기 위해서 또 한번, 이렇게 두 번 해시 테이블을 검색한다.
Functions
HSET Command
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가 해시 테이블에서 어떻게 값을 가져오는지를 설명한다.
- 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 >> |
---|