[Redis 연구 노트 (3)] 점프 테이블 및 정수 수집 구조에 대한 자세한 설명

이 기사는 공식 계정 [Developing Pigeon]에서 게재되었습니다! 팔로우에 오신 것을 환영합니다! ! !


이전 규칙-자매 타운 하우스 :

하나. 목록 건너 뛰기

(I. 개요

        호핑 목록은 정렬 된 데이터 구조로, 노드의 다른 노드에 대한 여러 포인터를 유지하여 노드에 빠르게 액세스하는 목적을 달성합니다. 평균 O (logN) 및 최악의 경우 O (N) 노드 검색을 지원하며 효율성은 Balanced Tree와 유사하며, 사전에 간단하기 때문에 Balanced Tree를 대체 할 수 있습니다. Redis는 두 위치에서만 점프 테이블을 사용합니다. 하나는 순서가 지정된 키 집합을 구현하는 것이고 다른 하나는 클러스터 노드에서 내부 데이터 구조로 사용되는 것입니다.

(2) 점프 테이블의 실현

        Redis 스킵리스트는 zskiplistNode 구조와 zskiplist 구조로 정의되며, zskiplistNode 구조는 스킵리스트 노드를 나타내며, zskiplist 구조는 스킵리스트 노드의 관련 정보를 저장하는 데 사용됩니다.


1. zskiplist

구조에는 다음 속성이 포함됩니다.

        header : 점프 테이블의 헤더 노드.

        tail : 스킵 목록의 꼬리 노드.

        레벨 : 헤드 노드를 제외하고 현재 홉 테이블에서 가장 큰 레벨의 노드 레벨을 기록합니다.

        길이 : 건너 뛰기 목록의 길이

2. zskiplistNode

구조에는 다음 속성이 포함됩니다.

        레벨 배열 : 점프 테이블 노드의 각 레이어, 각 레이어에는 두 가지 속성이 있습니다. 하나는 포워드 포인터이고 다른 하나는 스팬입니다. 프로그램은 이러한 레이어를 사용하여 다른 노드에 대한 액세스 속도를 높일 수 있습니다. 레이어 수가 많을수록 , 더 빠른 속도. 새로운 점프 테이블 노드가 생성 될 때마다 1-32 사이의 값이 레벨 배열의 크기, 즉 레벨의 높이로 무작위로 생성됩니다.

        정방향 포인터 : 테이블 끝에있는 다른 노드에 액세스하는 데 사용됩니다.
Span : 정방향 포인터가 가리키는 노드와 현재 노드 사이의 거리를 기록합니다. 스팬은 순위를 계산하는 데 사용됩니다. 모든 레이어의 범위를 더한 결과 점프 테이블에서 대상 노드의 순위가 결정됩니다.

        뒤로 포인터 : 현재 노드에있는 이전 노드를 가리 킵니다.

        점수 : 각 노드의 분기는 작은 것에서 큰 것까지 정렬됩니다.
        멤버 개체 : 각 노드는 문자열 개체 (SDS)에 대한 포인터 인 멤버 개체를 동일한 점프 테이블에 저장합니다. 고유하지만 여러 노드에 의해 저장된 점수는 동일 할 수 있으며 동일한 점수를 가진 노드는 사전 순으로 구성원 개체의 크기에 따라 정렬됩니다.


두. 정수 세트

(I. 개요

        정수 집합은 집합 키의 기본 구현 중 하나입니다. 집합에 정수 값 요소 만 포함되어 있고이 집합의 요소 수가 적 으면 Redis는 정수 집합을 집합 키의 기본 구현으로 사용합니다.

(2) 실현

        정수 집합은 Redis에서 정수 값을 저장하는 데 사용하는 추상 데이터 구조입니다. int16_t, int32_t, int64_t 유형의 정수 값을 저장할 수 있으며 중복 제거 작업이 있습니다.

구조는 다음과 같습니다.

typedef struct intset{
    
    
	uint32_t encoding;
	uint32_t length;
	int8_t contents[];
}intset;

        컨텐츠 배열의 각 요소는 세트의 각 정수이며 값의 오름차순으로 정렬되며 중복은 없습니다.

        길이 속성은 정수 집합에 포함 된 요소의 수를 기록합니다.

        인코딩 속성은 콘텐츠 배열에 저장된 항목의 유형을 결정합니다.


(3) 업그레이드

        정수 컬렉션에 새 요소를 추가하고 새 요소의 유형이 정수 컬렉션에있는 기존 요소의 유형보다 길 때마다 정수 컬렉션을 업그레이드해야 새 요소를 추가 할 수 있습니다. 정수 수집. 다음과 같이 진행하십시오.

        1. 새 요소의 유형에 따라 정수 집합의 기본 배열 공간 크기를 확장하고 새 요소에 대한 공간을 할당합니다.

        2. 기본 배열의 모든 기존 요소를 새 요소와 동일한 유형으로 변환하고 변환 된 요소를 올바른 위치에 배치합니다. 요소의 크기가 확장되기 때문에 새 요소의 위치는 다음과 같이 결정됩니다. 마지막 사람이 된 다음 순서를 변경하지 않고 유지하기 위해 뒤에서 앞으로 위치를 재 할당하십시오.

        3. 기본 배열에 새 요소를 추가합니다.

        업그레이드 작업으로 인해 정수 집합에 새 요소를 추가하는 시간 복잡도는 O (N)입니다. 정수 세트는 다운 그레이드 작업을 지원하지 않습니다. 어레이가 업그레이드되면 업그레이드 된 상태로 유지됩니다.


(4) 업그레이드의 장점

1. 유연성 향상

        C 언어는 정적으로 형식화 된 언어이므로 형식 오류를 방지하기 위해 동일한 데이터 구조에 다른 형식의 값을 넣지 않습니다. 정수 컬렉션을 사용한 업그레이드는 형식 오류에 대한 걱정없이 새로운 요소에 자동으로 적응할 수 있습니다.

2. 메모리 절약

        업그레이드는 대용량 패키지에서 가장 큰 유형을 직접 사용하는 대신 필요한 경우에만 수행되므로 메모리를 최대한 절약 할 수 있습니다.

추천

출처blog.csdn.net/Mrwxxxx/article/details/113874690