머리말
우리는 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 명령을 키 후 서버가 변경을 모니터링 트랜잭션이 수정 된이 키 프로그램의 메모를했다 있도록 키는, 더러운 (더러운)로 표시됩니다.
- 마다 키 서버를 수정 한 후,이 값에 더러운 것 (얼룩) 키 카운터가 하나씩 증가되고, 카운터는 지속 서버를 실행하고 동작을 행하는 복사한다.