레디 스 시리즈 ------ 데이터베이스

머리말

우리는 KV의 레디 스 데이터베이스를 설정하면 KV 저장? 우리가 언제,에서 얻는 경우에 나가 곳. 시간의 복잡성, 공간의 복잡성 등, 그래서 문제의 범위를 최적화하는 방법.

Server 데이터베이스

레디 스 서버의 모든 데이터베이스 정보가 redis.h ## redisService 구조에 저장된다. 다음과 같이 코드입니다 :

. (1)  구조체 redisServer {
 2  
3.      // ... 
4.  
5.      / * 일반 * / 
6.  
7.      // 구성 파일 절대 경로 
8.      CHAR *에서 configFile;            / * 절대 config 파일 경로 또는 NULL * / 
. 9  
(10)      // 데이터베이스 
. 11      redisDb DB *;
 (12)는  
13이다       // 암호인지 여부를 
14      숯불 * requirepass;          / * 정식 명령, 또는 NULL 패스 * / 
15  
(16)      // PID를 파일 
(17).      문자 * PidFile;              / * PID 파일 경로 * / 
18  
(19)      // TCP 포트들을 
20      INT 포트;                    / * TCP 듣기 포트 * / 
21  
(22)     // ... 
23  
24 }

열 몇, 나는 더 중요한 생각합니다. 가장 중요한, 확실히 하나 redisDb * DB를, 이 데이터 구조를 저장 우리의 모든 데이터.

레디 스는 키 - 값 쌍 (키 - 값 쌍) 데이터베이스 서버이고, 각 데이터베이스는 구성  redis.h/redisDb , 구조  redisDb 의 구조  dict 사전 데이터베이스가 오른쪽에있는 모든 키를 보유하고, 우리는 사전 키 스페이스라고도한다 (키 공간). 다음과 같이 코드입니다 :

/ * 레디 스 데이터베이스 표현. IDENTIFIED 여러 데이터베이스있다 
 최대 구성된까지 0의 정수 (기본 데이터베이스)로 * 
 (가) 'ID'의 구조 필드 데이터베이스 * 데이터베이스. 숫자. * / 
으로 typedef 구조체 redisDb { 

    // 스페이스 키 데이터베이스, 데이터베이스의 모든 키 보유 
    DICT의 *의 딕셔너리를;                  / * 다음은이 DB에 대한 키 스페이스에서 * / 

    // 만료 시간 키, 키가 사전에 열쇠이다, 사전 만료 이벤트 UNIX 타임 스탬프입니다 
    * DICT 만료;               / * 시간 제한을 SET와 키의 제한 시간 * / 

    // 키를 차단 된 상태에 
    DICT * blocking_keys;         / * 데이터 (BLPOP)를 기다리는 고객과 키 * / 

    //키 차단 해제 
    딕셔너리를 * ready_keys;            / * 차단받은 키 누름 * / 

    // 되고 모니터링 WATCH 명령 열쇠 
    딕셔너리는 * watched_keys;          / * 하여 MULTI / EXEC의 CAS가 감시 키 * / 

    구조체 evictionPoolEntry * eviction_pool;     / * 풀 퇴거의 키 * / 

    // 데이터베이스 번호 
   , INT의 ID / * 데이터베이스 ID * / // 평균 TTL 키 데이터베이스, 통계  , avg_ttl           / * 그냥 통계의 평균 TTL, * / 
} redisDb;                     

    
     

가장 중요한 것은  DICT의 *의 DICT, 그는 사전이다, 작은 파트너를 이해하지 않는다, 당신은 (https://www.cnblogs.com/wenbochang/p/11673590.html)에 대한 중 하나 전에 내 기사를 볼 수 있습니다 레디 스 자세한 설명을 사전.

DICT 우리의 실제 데이터 저장.

직접 데이터베이스를 해당 사용자가 볼 키와 공간 :

  • 키는 키의 공간 키 데이터베이스이며, 각 키는 문자열 객체입니다.
  • 키 공간의 값은 데이터베이스의 값, 각 값은 문자열,리스트, 해시 테이블, 객체, 객체의 컬렉션을하고있는 레디 스 객체를 포함하는 객체의 집합을 명령 할 수 있습니다.

키 공간 데이터베이스는 사전 데이터베이스에 대해 이렇게 모든 작업 때문에 - 예컨대 데이터베이스에 대한 키 - 값 쌍을 추가하는 등을하거나 등의 키 - 값 쌍을 데이터베이스에서 삭제하거나 데이터베이스의 키 - 값 쌍을 얻을 , 실제로 달성하기 위해 공간 사전 키의 조작에 의해 행해진 다. 그래서 기본은 분명 복잡도 O (1) 수준이며,이 너무 빨리 레디 스 왜 중요한 이유이다.

 

본드의 값

키 값의 데이터베이스는, 실제로, 키 공간 목표 키에 대응하는 값을 취한다. 다음과 같이 코드입니다 :

1  / * 
2  *가 사전에 포함되어있는 키, 노드 키를 반환
 3  *
 4  * 리턴 노드 발견 발견되지 복귀가 NULL이
 . 5  *
 . 6  * T = O (1)
 . (7)   * / 
. 8 dictEntry * dictFind (딕셔너리의 D *를 CONST  무효 * 키)
 (9).  {
 10      dictEntry * 의 He는,
 . 11      부호 INT의 H는 IDX 테이블,
 12는  
13이다      // 사전 (해시 테이블) 빈 
(14)      IF (D-> HT [ 0 ] 크기는 == 0 ) 복귀 NULL ; / * 우리는 모든 테이블에이 있나요* / 
15  
16      // 조건이 허용하는 경우, 하나의 단계는 개작 
17.      IF (dictIsRehashing (D)) _dictRehashStep (D)
 (18)는  
19.      // 키의 해시 값을 계산하는 
것이다 (20)      H = dictHashKey (D, 키)
 (21)는이      / / 사전 버튼의 룩업 해시 테이블
 (22)이      // T O = (1). 
(23)는      에 대해 (표 = 0 표 <= 1이다. 표 ++ ) {
 24  
(25)          // 인덱스 값을 계산하는 단계 
(26)는          IDX = H & D-> HT [표] .sizemask;
 27  
(28)          // 지정된 인덱스에있는 모든 노드 목록을 통과, 키 볼 
(29)          의를 그는 = D->HT [표] [IDX] .table;
 30          // . (1) T O = 
31이          그동안 (헬륨 (He)) {
 32  
(33)는              IF (dictCompareKeys (D, 키, 끼어들> 키))
 (34)가                  복귀 의 He;
 35  
(36)              그 중 그는 = 중 -> 다음,
 37          }
 38  
39          // 프로그램이 0 해시 테이블을 통과하는 경우, 여전히 지정된 노드를 찾지 못했습니다 키
 (40)          // , 재탕 동안 사전 여부를 확인합니다 프로그램
 (41)          //을 직접 반환 결정하기 전에 NULL 또는 해시 테이블 룩업 호 계속 
42한다          IF (! dictIsRehashing (D)) 리턴 ; NULL
 43이다      }
 (44) 인  
45      //본원에 두 개의 해시 테이블을 찾을 수 없습니다 설명 할 때 
46입니다      반환 NULL은;
 47 }

 

코드를 봐 실제로 매우 간단합니다.

  • 첫째, 사전이 비어 있는지 여부를 확인, 비어있는 경우, 직접 반환 널 (null)을 계속 할 필요가 없다
  • 두 번째 단계, 개작, 제 프로그레시브 형 개작을 행하는 경우. (내가 이해가 안 나는 블로그 게시물에 설정)
  • 해시 키 값을 산출하는 제 3 단계.
  • 제 4 단계는, HT [0], HT [1] 두 탁자 찾을. 이 목록 인 경우 경우에, 당신은 동안 루프를 찾아보실 수 있습니다.
  • 는 null를 찾을 수 없습니다, 수익을 찾습니다. 아주 간단하고 명확한 논리.
  • 도 다음과 같이 :

 

           

 

결합은, 모양과 비슷한 업데이 트를 추가, 삭제합니다. 나는 소스를 나열하지 않습니다.

즉 후

데이터베이스가 읽고 레디 스 명령을 사용하여 작성하는 경우, 서버는 또한 포함하여 몇 가지 추가 유지 보수 작업을 수행합니다 읽기, 지정된 키 공간을 수행하고 쓰기 작업을하지 않을 것이다 :

  • 하나의 키를 읽은 후 (읽기 키로 작업을 읽기 및 쓰기), 서버는 키 존재를 기반으로합니다 서버 공간 키 히트 (명중) 또는 키 공간 미스의 수를 갱신하기 위해 (미스) 번호 이 두 값이 될 수  의 정보 기록 명령  keyspace_hits 속성 및  keyspace_misses 속성보기.
  • 키를 판독 한 후, 키 서버에 명령하여,이 값을 산출 유휴 시간을 결합하는 데 사용될 수 LRU (최근 사용되는) 시간 업데이트되는  뷰에 idletime의 OBJECT <키> 키 명령을  key 대기 시간.
  • 키를 읽는 서버가있는 경우 키가 만료 된 것을 발견, 서버는 첫째, 만료 된 키를 삭제합니다 다른 작업의 나머지 부분의 이행 전에.
  • 사용하는 클라이언트가있는 경우  특정 키를 모니터링 할 수 WATCH 명령을 키 후 서버가 변경을 모니터링 트랜잭션이 수정 된이 키 프로그램의 메모를했다 있도록 키는, 더러운 (더러운)로 표시됩니다.
  • 마다 키 서버를 수정 한 후,이 값에 더러운 것 (얼룩) 키 카운터가 하나씩 증가되고, 카운터는 지속 서버를 실행하고 동작을 행하는 복사한다.

 

추천

출처www.cnblogs.com/wenbochang/p/11694402.html