Redis 원본 읽 기:Redis 문자열 SDS 상세 설명

4082 단어 Redis문자열SDS
SDS 기본 개념
단순 동적 문자열(Simple Dynamic String)SDS 는 Redis 의 기본 문자열 로 사 용 됩 니 다.
C 언어의 문자열:빈 문자 로 끝 나 는 문자 배열
SDS 구현 예시

redis > SET msg "hello world"
OK
저 희 는 SET 를 통 해 Redis 데이터베이스 에 데이터 키 대상 이'msg'이 고 데이터 값 대상 이'hello World'인 키 쌍 을 만 들 었 습 니 다.그 중에서 데이터 키 와 데이터 값 대상 의 바 텀 문자열 은 모두 SDS 입 니 다.아울러 SDS 는 AOF 버퍼 에 도 사용 된다.
SDS 정의

struct sdshdr {
    #    buf            ,           
    #    SDS            
    int len;
    #    buf            ,buf       ,append     
    int free;
    #   char  ,       ,         ,             '\0'
    char buf[];
};
buf 속성의 바이트 배열 의 문자열 길 이 는 len 속성 값 에 1 을 추가 하 는 것 과 같 습 니 다.Redis 는 C 언어의 규범 에 따라 SDS 데이터 형식 문자열 의 끝 에 빈 문자열 을 추가 하여 1 개의 바이트 공간 을 추가 로 차지 합 니 다.이 1 개의 바이트 공간 은 SDS 의 len 속성 에 계산 되 지 않 습 니 다.
SDS 는 문자열 의 끝 에 C 언어 문자열 규범 에 맞 는 빈 문자열 을 추가 하기 때문에 Redis 문자열 작업 은 C 언어의 일부 문자열 라 이브 러 리 의 함 수 를 호 환 할 수 있 습 니 다.Redis 는 SDS 를 위해 함 수 를 만 들 필요 가 없습니다.
SDS 의 장점
상수 복잡 도 문자열 길이 가 져 오기
  • C 문자열 은 빈 문자 에 부 딪 힐 때 까지 전체 문자열 을 옮 겨 다 니 며 계산 해 야 합 니 다.계산 을 멈 추고 복잡 도 는 O(N)
  • 입 니 다.
  • SDS 는 len 속성 치 를 획득 하면 되 며,복잡 도 는 O(1)입 니 다.그래서 STRLEN 의 복잡 도도 O(1)
  • 입 니 다.
    API 보안,버퍼 넘 침 방지
  • C 문자열 은 문자열 을 strcat 에 연결 할 때 충분 한 공간 을 미리 배정 하여 맞 춤 형 문자열 을 수용 해 야 합 니 다.그렇지 않 으 면 버퍼 가 넘 치 는 문제 가 발생 할 수 있 습 니 다.예 를 들 어 가 까 운 공간 에 다른 문자열 이 있 습 니 다.
  • SDS 는 문자열 연결 을 할 때 len 의 길이 가 충분 한 지 확인 하고 부족 하면 len 을 확장 한 다음 문자열 연결 을 합 니 다.
  • 문자열 길 이 를 변경 할 때 필요 한 메모리 재배 치 횟수 를 줄 입 니 다.
  • 공간 사전 분배
  • SDS 를 공간 확장 할 때 확 장 된 len 값 이 1mb 보다 작 으 면 확 장 된 len 값 을 free 속성 으로 할당 하여 다음 확장 시 미리 분 배 된 사용 되 지 않 은 공간 으로 합 니 다.다음 확장 에 필요 한 바이트 공간 이 free 값 보다 작 으 면 공간 확장 없 이 사용 되 지 않 은 공간 을 직접 사용 합 니 다.
  • 타성 공간 방출
  • 마찬가지 로 기본적으로 SDS 를 축소 할 때 축 소 된 공간 은 이 SDS 에 의 해 즉각 방출 되 지 않 고 free 에 배정 되 며 나중에 확장 할 때 사용 할 수 있 습 니 다.
  • Redis 의 SDS 유형 은 이 두 가지 공간 배분 전략 을 통 해 문자열 의 증가 와 축소 에 필요 한 메모리 재 할당 작업 을 줄 이 고 메모리 배분 에 최 적 화 를 제공 합 니 다.
  • 바 이 너 리 보안
    Redis 는 C 문자열 의\\0 이 아 닌 len 속성의 값 을 통 해 종료 여 부 를 판단 합 니 다.
    호 환 부분 C 문자열 함수
    위 에서 언급 한 SDS 는 끝 에\0 을 추 가 했 습 니 다.이렇게 하면 일부 C 문자열 함 수 를 호 환 할 수 있 고함수 라 이브 러 리 를 직접 사용 할 수 있 습 니 다.
    Redis 문자열 원본 원리
    1.Redis 의 문자열 구 조 는[SDS]구조 로 설계 되 었 습 니 다.
    문자열 의 실제 내용 은 배열 에 저 장 됩 니 다.다음 표 입 니 다.
    
    struct SDS<T> {
      T capacity; //     
      T len; //       
      byte flags; //      ,    
      byte[] content; //     
    }
    
    문자열 의 크기 가 현재 분 배 된 capacity 시간 을 초과 하면 배열 은 확장 되 고 더 큰 배열 을 분배 하 며 오래된 배열 을 새 배열 에 복사 한 다음 문자열 에 추가 합 니 다.
    2.embstr 와 raw
    1)Redis 문자열 의 저장 방식 은 길이 가 매우 짧 을 때 emb 형식 으로 저장 하고 길이 가 44 를 초과 할 때 raw 로 저장 하 는 2 가지 로 나 뉜 다.
    2)두 사람의 차이 점:
    Redis 의 대상 헤드 구 조 는 다음 과 같다.
    
    struct RedisObject {
        int4 type; // 4bits
        int4 encoding; // 4bits
        int24 lru; // 24bits
        int32 refcount; // 4bytes
        void *ptr; // 8bytes,64-bit system
    } robj;
    
    해석:서로 다른 대상 은 서로 다른 유형의 type 을 가지 고 있 습 니 다.같은 유형의 type 은 서로 다른 저장 형식 encoding 이 있 습 니 다.lru 를 사용 하여 대상 의 LRU 정 보 를 기록 합 니 다.대상 마다 하나의 인용 계수 가 있 습 니 다.0 이면 대상 이 소각 되 고 메모리 가 회수 됩 니 다.pre 지침 은 대상 내용 의 구체 적 인 저장 위 치 를 표시 하 는 데 사용 된다.상소 대상 은 구조 적 내용 을 합치 면 16 바이트 의 저장 공간 을 차지 해 야 한다.
    SDS 대상 헤드 크기:실제 내용 의 크기(capacity)+3byte,3 은 capacity+len+flags 내용 을 합 친 길이 이 고,content 배열 의 초기 값 은 16 이 며,모든 SDS 의 최소 크기 는 19(16+3)입 니 다.
    저장 형식 은 다음 과 같다.

    해석:embstr 는 RedisObject 대상 헤드 와 SDS 대상 을 연속 으로 존재 시 키 고 malloc 방법 으로 한 번 에 분배 합 니 다.raw 는 두 번 의 malloc 가 필요 합 니 다.두 대상 의 머리 를 때 려 죽 이 는 메모리 주 소 는 보통 연속 되 지 않 습 니 다.embstr 최대 수용 가능 한 문자열 길 이 는 44 바이트 입 니 다.
    3.확장 전략
    문자열 은 길이 가 1M 보다 작 을 때 까지 확장 공간 은 100%중복 공간 을 유지 하 는 두 배 정책 을 사용 합 니 다.길이 가 1M 이상 이면 차 확장 없 이 1M 의 불필요 한 공간 만 더 분배 할 수 있다.
    이상 은 개인 적 인 경험 이 므 로 여러분 에 게 참고 가 되 기 를 바 랍 니 다.여러분 들 도 저 희 를 많이 응원 해 주시 기 바 랍 니 다.

    좋은 웹페이지 즐겨찾기