실제 데이터 구조에 사용되는 레디 스 분석

첫째, 공통의 데이터 구조의 목록
1.String :
간단한 키 값 유형은 디지털 값이 될 수 있고, 문자열 일 수있다. 사용 장면 캐싱 시스템 드롭 다운 상자 값, 인터페이스를 (사용, 메커니즘이 만료 주요 증가 메커니즘 증분 만료) 제한, 분산 세션을 저장을 가지고, 사용자 점 등등.
2.List :
문자열의 단순리스트는 큐 데이터 구조 타입합니다 (FIFO)에 삽입 될 수 있거나 꼬리 데이터 큐 헤드 삭제. 일반적인 사용 메시지 큐와 시나리오 (lpop, rpush), 차트, 실시간 차트 (Zsort를 달성 할 수있다).
3.Hash : 문자열 유형 필드와 값의 매핑 테이블. 사용 시나리오는 사용자가 로그인 상태 정보 (개체 속성이 자주 변경) 쇼핑 카트 저장, 저장됩니다.
4.Set :
문자열 유형 컬렉션, 무질서한 요소는 반복되지 않을 것이다. 사용 시나리오 체계적인 화이트리스트 블랙리스트 설정
후 SET 5.Sort :
문자열 유형 컬렉션, 서열 요소와 중복되지. 차트와 일반적으로 실시간 설계에 사용 등
두 가지 간단한 동적 문자열 SDS (간단한 동적 문자열)

sdshdr는 구조체 {
// BUF 어레이에 사용 된 바이트 수 기록
SDS 저장 문자열의 길이와 동일 //
INT 렌;
// 바이트 배열의 레코드 번호가 미사용 BUF
무료 지능;
// 바이트 배열과 저장하는 문자열
[] buf를 숯불;
}
메모리는 다음과 같다 :
[화상 삽입 본원에 기재된 (https://img-blog.csdnimg.cn/20190724134444162.png?x-oss-process=image/watermark! , type_ZmFuZ3poZW5naGVpdGk는 shadow_10는 text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L05hbkd1b0h1YW5nRG91, size_16, color_FFFFFF, t_70)
무료 : 0 SDS가 사용되지 않는 공간에 할당되지 나타냅니다.
렌 : 5는 현재 저장된 문자열의 길이가 5냅니다.
버피 : 문자의 문자 유형의 배열입니다.
! [삽입 여기서 설명한 이미지 (https://img-blog.csdnimg.cn/20190724135159624.png)
다른 프리 여기 동일.도 5는 할당되지 않은 길이의 5 개가이있는 문자 배열을 나타낸다.
이 미사용 공간에서, 레디 스는 미리 할당 된 공간에 불활성 릴리스 두 가지 전략을 달성한다.
공간 사전 할당 : 따라서 캐릭터 동작을 증가시키기 위해 필요한 메모리의 재 할당의 수를 감소 문자열 공간 확장 필요보다 더 확장 메모리가, 연속적으로 수행하는 경우.
불활성 릴리스 : 문자열 작업을 단축 할 때 메모리가 즉시 단축 회복 여분의 바이트를 재 할당하지 않지만, 아래로 무료 바이트의 속성 레코드 번호의 사용은, 이후의 사용을 기다립니다. (SDS는 해당 API를 제공 할 때, 우리가 필요로 할 때, 당신은 또한 수동으로 사용되지 않는 공간을 해제 할 수 있습니다.)

세, 목록
목록 노드 정의 :

구조체 {listnode 타입 정의

// 프리앰블 노드
구조체 listnode * PREV;

// 후방 노드
구조체 listNode * 다음,

값 // 노드
무효 * 값;

} listnode,

이중 연결리스트
[삽입 여기서 설명한 이미지 (HTTPS /! /img-blog.csdnimg.cn/20190724143745229.png)
목록 작업 목록을 사용

목록 구조체 {형식 정의

// 헤더 노드
listnode * 머리;

// 테이블 꼬리 노드
listNode * 꼬리,

노드의 수는 목록에 포함 //
부호없는 긴 렌;

// 복사 노드 값 기능
무효 * (* DUP) (무효 *의 PTR );

// 릴리스 기능의 노드 값
무효 (무료 *) (무효 * PTR);

// 노드 값 비교 기능
INT (* 일치) (PTR의 무효 * 무효) 키 *;

목록};

그것은 목록 테이블 포인터 머리, 꼬리 포인터 테이블 꼬리, 체인 길이 카운터 렌의 DUP에 대한 목록 구조를 제공, 무료와 일치하는 회원 다형성 목록의 특정 유형을 달성하기위한 필요한 기능은 다음과 같습니다 :
● DUP 복사 기능이 사용됩니다 노드 목록에 저장된 값,
저장된 값을 해제 ● 프리리스트 노드 기능;
● 함수는 입력 값과 상기 노드리스트에 저장된 다른 비교 값과 일치하도록 사용은 동일하다
[삽입 여기서 설명한 이미지 (HTTPS! : X-OSS 프로세스 //img-blog.csdnimg.cn/20190724144054122.png = 이미지 / 워터 마크 type_ZmFuZ3poZW5naGVpdGk, shadow_10, text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L05hbkd1b0h1YW5nRG91, size_16, color_FFFFFF, t_70)
네 사전
레디 스 사전 기본으로 해시 테이블을 이용하여 구현 여러 노드를 가질 수 있습니다 해시 테이블 해시 테이블 및 해시 테이블의 각 노드는 키 값 쌍의 사전을 보유하고 있습니다. HashMap의 자바와 유사

구조체 {dictht 타입 정의

// 해시 테이블 어레이
dictEntry ** 표;

// 해시 테이블 크기
부호 롱 사이즈,

인덱스 값을 계산하는 해시 마스크 테이블 // 크기
. // 1은 동일한 크기 항상
부호 긴 sizemask ;

기존 노드의 // 해시 테이블 수
긴 사용 부호;

} dictht;

노드 정의

구조체 {dictEntry 타입 정의

// 키
무효 * 키;

// 값
연합 {
공극 * 브로;
uint64_tu64;
int64_ts64;
} V]

다음 노드로 // 해시 테이블 포인트리스트가 형성된
구조체 * 다음 dictEntry;
} dictEntry,

둘 사이의 관계 다음 구조이다 :
! [삽입 여기서 설명한 이미지 (https://img-blog.csdnimg.cn/2019072414502986.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L05hbkd1b0h1YW5nRG91,size_16,color_FFFFFF,t_70) ! [여기에서 삽입 사진 정보 (https://img-blog.csdnimg.cn/20190724145131933.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L05hbkd1b0h1YW5nRG91,size_16,color_FFFFFF,t_70)

당신이 사전에 새 키를 추가 할 때, 프로그램이 인덱스 값에 따라 다음 해시 키 값과 인덱스 값을, 키에 따라 계산해야 해시 테이블은 키 - 값 쌍에게 새로운 노드를 포함하는 상기 해시 테이블 배열의 인덱스를 지정한다.

** 해시 알고리즘 **
> 사전을 사용하는 해시 함수가 제공되고, 주요 키의 해시 값을 산출
> = 해시 dict-> 고정형 HashFunction (키)>;
sizemask 특성과 해시 테이블을 이용하여 해시 값> 계산 된 인덱스 값
> 상황에 따라, HT는 [X] HT 될 수있다 [0] 또는 HT [1] = ndex 해시 및 dict-> HT [X] .sizemask;


** ** 해결 키 충돌

두 개 이상의 키의 수는 상기와 동일한 배열 인덱스 해시 테이블에 할당이있는 경우>에서는 이러한 키 충돌 (충돌)을 호출한다.
> 어드레스 쇄 (분리하여 레디 스 해시 테이블에있어서
충돌을 해결> 체인) 키가 각각의 노드는 다음 포인터를 다음 포인터와 단독으로 연결된 목록을 구성 할 수있다 노드의 해시 테이블 복수 할당되는 해시 테이블을 가지고 같은 인덱스에 여러 노드에 갈등의 핵심 문제를 해결 할 목록 연결이 방법을 연결하는 데 사용할 수 있습니다.

! [여기에 그림 삽입 설명] (https://img-blog.csdnimg.cn/20190724162244200.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L05hbkd1b0h1YW5nRG91,size_16,color_FFFFFF,t_70)
** 확장 수축 **

당신이 너무 많이 또는 너무 적은 해시 테이블 키를 저장할 때>, 그것은 rerehash (재탕)에 의해 해시 테이블의 확장 또는 수축을 대응하는 것이 필요하다. 특정 단계 :
>
확장 된 동작을 실행하는 경우> 1 (즉 정보가 원래의 해시 테이블에 기초하여 각각의 원래의 해시 테이블에 따라 사용되는 크기와 동일 HT [0] * 2N 해시 테이블 한때는 작성 공간을 두 배로하는) 다른 해시 테이블을 생성합니다. 당신이 축소 작업을 수행하는 경우 반대로, 감소 각 수축 공간의 사용을 기반으로 한 새로운 해시 테이블을 생성하는 두 배.
>
> 2, 다시 인덱스 값, 해쉬 테이블의 위치에 새로운 키 - 값 쌍을 계산하도록 상기 해싱 알고리즘을 사용.
>
마이그레이션이 완료 한 후> 3, 모든 키 - 값 쌍은 원래의 해시 테이블의 메모리 공간을 해제.

확장을 유발 ** ** 조건

> 1 서버는 현재 BGSAVE BGREWRITEAOF 명령 또는 명령을 실행하지 않고, 부하율은 1 이상의.
>
> 2 서버는 현재 BGSAVE BGREWRITEAOF 명령 또는 명령을 실행하고, 부하율 이상의 5와 동일하다.
>
> PS : = 팩터로드 노드의 저장 해시 테이블 / 해시 테이블 크기의 수. 점근 개작
>
> 신축 동작 일회용 중앙 완료하지만, 복수 회, 프로그레시브 완료되지. 당신은 단지 몇 수십에서 레디 스 키 - 값 쌍을 저장하면 다음 재탕
> 즉시 수행 할 수 있지만, 키 - 값 쌍은 수백만이있는 경우, 수백만 또는 수백만의 수백 수십, 다음 한 번 수행
> 재탕을, 필연적으로 다른 동작을 초래할 것이다 레디 스 시간 이내에 수행 될 수 없다. 그래서 레디 스 프로그레시브 사용
> 재탕을, 그래서 진보적 재탕의 기간 동안 업데이트를 찾기 위해 사전을 삭제하고 다른 작업을 먼저 해시 테이블을 찾을 수없는 두 개의 해시 테이블, 수행 될 수있다, 제 2 헥타르로 이동합니다 테이블에 찾을 수 있도록 노력하겠습니다. 그러나 수
> 증가 작업은 새로운 해시 테이블에 수행해야합니다.

추천

출처www.cnblogs.com/jarvisblogs/p/11257828.html