Redis 원본 읽 기:Redis 문자열 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 의 장점
상수 복잡 도 문자열 길이 가 져 오기
API 보안,버퍼 넘 침 방지
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 의 불필요 한 공간 만 더 분배 할 수 있다.
이상 은 개인 적 인 경험 이 므 로 여러분 에 게 참고 가 되 기 를 바 랍 니 다.여러분 들 도 저 희 를 많이 응원 해 주시 기 바 랍 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
그래프 구조를 무상으로 취급할 수 없는 것은 싫기 때문에, redisgraph를 WSL2에 극치고 설치해 보았습니다.제목은 만우절이므로. 그렇다, 역시, 앞으로는 그래프 구조 데이터베이스라고 생각했다. 생각한 것은 몇 년 전인가. 전부터 Neo4j는 시험하고 있지만, 영업 분들로부터 상용 라이센스가 높다고 가르쳐 주었으므로, 전전...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.