>  기사  >  데이터 베이스  >  Redis의 객체 구조를 정의하는 방법

Redis의 객체 구조를 정의하는 방법

WBOY
WBOY앞으로
2023-05-28 17:20:171606검색

Redis의 객체 구조를 정의하는 방법

Redis의 2계층 데이터 구조 소개

Redis의 성능이 뛰어난 이유 중 하나는 각 데이터 구조가 하나 이상의 데이터 구조에 의해 특별히 설계되고 지원된다는 점입니다. 읽기 및 쓰기 성능을 향상시키는 유연한 데이터 구조입니다. Redis의 데이터 구조는 두 가지 다른 관점에서 논의될 수 있습니다

  • 첫 번째 수준은 사용자 관점입니다. 이 수준은 Redis가 외부에 노출하는 문자열, 목록, 해시, 집합 등의 호출 인터페이스이기도 합니다. 정렬된 세트입니다.

  • 두 번째 수준은 내부 구현의 관점에서 볼 때 dict, sds, ziplist, Quicklist, Skiplist, intset과 같은 하위 수준 구현입니다.

Redis 데이터 구조의 내부 구현

Redis 사용자의 관점에서 Redis 노드에는 여러 데이터베이스가 포함됩니다(기본값은 비클러스터 모드에서 16개이고 클러스터 모드에서는 1개만 가능). 키 공간에서 객체 공간으로의 매핑 관계를 유지합니다. 이 매핑 관계의 키는 문자열 유형이며 값은 문자열, 목록, 해시, 집합, 정렬된 집합 등과 같은 여러 데이터 유형일 수 있습니다. 키 유형은 항상 문자열이지만 값은 여러 유형일 수 있습니다.

Redis의 내부 구현 관점에서 데이터베이스 내 매핑 관계는 dict를 사용하여 유지됩니다. dict의 키가 동적 문자열 sds인 고정 데이터 구조로 표현되는 것으로 충분합니다. 값은 더 복잡합니다. 동일한 dict에 다양한 유형의 값을 저장하려면 범용 데이터 구조가 필요합니다. 이 범용 데이터 구조는 robj이고 전체 이름은 redisObject입니다.

예:

  • 값이 목록인 경우 내부 저장소 구조는 퀵리스트입니다.

  • 일반적으로 값이 문자열인 경우 내부 저장 구조는 대개 sds입니다. 하지만 문자열 유형의 값이 숫자인 경우 Redis는 내부적으로 이를 long 유형으로 변환하여 저장하므로 메모리 사용량이 줄어듭니다.

그래서 robj는 sd뿐만 아니라 퀵리스트, 심지어 긴 유형까지 나타낼 수 있습니다.

redisObject 구조

redisObject는 다음과 같이 정의됩니다.

typedef struct redisObject {
    unsigned type:4;
    unsigned encoding:4;
    unsigned lru:LRU_BITS; /* lru time (relative to server.lruclock) */
    int refcount;
    void *ptr;} robj;

A robj에는 다음 5개 필드가 포함됩니다.

  • type: 개체의 데이터 유형입니다. 4비트를 차지합니다. 5가지 가능한 값이 있습니다: OBJ_STRING, OBJ_LIST, OBJ_SET, OBJ_ZSET,

    OBJ_HASH. 이는 각각 Redis에서 공개하는 5가지 데이터 구조에 해당합니다.

  • encoding: 객체의 내부 표현(인코딩이라고도 함), 회계 4비트의 경우 10개의 가능한 값이 있습니다.

  • lru: LRU 교체 알고리즘에 사용되며 24비트를 차지합니다.

  • refcount: 참조 횟수. 특정 상황에서 robj 객체를 공유할 수 있습니다.

  • ptr: 데이터 포인터. 실제 데이터를 가리킵니다. 예를 들어, 문자열을 나타내는 robj의 ptr은 sds 구조를 가리킬 수 있으며, 해당 ptr은 퀵리스트를 가리킬 수 있습니다.

여기서 주의깊게 살펴보아야 할 것은 인코딩 분야입니다.

동일한 유형이 서로 다른 인코딩에 해당할 수도 있습니다. 이는 동일한 데이터 유형이 서로 다른 내부 표현을 가질 수 있음을 의미합니다. 내부 표현이 다르면 메모리 사용량과 검색 성능이 다릅니다.

type = OBJ_STRING이면 이 robj가 문자열을 저장한다는 의미입니다. 이때 인코딩은 다음 세 가지 유형 중 하나일 수 있습니다.

  • OBJ_ENCODING_RAW: 문자열은 다음과 같은 기본 표현 방법을 사용합니다. SD.

  • OBJ_ENCODING_INT: 문자열은 숫자로 표현되며 실제로는 긴 유형입니다.

  • OBJ_ENCODING_EMBSTR: 문자열은 특수 내장형 SD로 표현됩니다.

type = OBJ_HASH이면 이 robj가 해시를 저장한다는 의미입니다. 이때 인코딩은 다음 두 가지 유형 중 하나일 수 있습니다.

  • OBJ_ENCODING_HT: 해시는 dict로 표현됩니다.

  • OBJ_ENCODING_ZIPLIST: 해시는 ziplist로 표시됩니다.

인코딩의 10가지 값은 다음과 같습니다.

  • OBJ_ENCODING_RAW: 가장 원시적인 표현입니다. 이 인코딩 값은 문자열 유형(sds로 표시됨)에만 적용됩니다.

  • OBJ_ENCODING_INT: 숫자로 표현됩니다. 실제로는 long으로 표현됩니다.

  • OBJ_ENCODING_HT: dict로 표현됩니다.

  • "OBJ_ENCODING_ZIPMAP"은 더 이상 사용되지 않는 오래된 표현입니다.. Redis 2.6보다 작은 버전에서만 사용할 수 있습니다.

  • OBJ_ENCODING_LINKEDLIST: 이 표현 역시 오래된 표현이라 더 이상 사용되지 않습니다.

  • OBJ_ENCODING_ZIPLIST: ziplist로 표현됩니다.

  • OBJ_ENCODING_INTSET: intset으로 표현됩니다. 집합 데이터 구조에 사용됩니다.

  • 스킵리스트 형태로 표현되는 객체 인코딩은 OBJ_ENCODING_SKIPLIST입니다. 정렬된 집합 데이터 구조에 사용됩니다.

  • OBJ_ENCODING_EMBSTR: 특수 임베디드 SD로 표현됩니다.

  • OBJ_ENCODING_QUICKLIST: 퀵리스트로 표현됩니다. 목록 데이터 구조에 사용됩니다.

redisObject의 역할

redisObject의 역할은 다음과 같습니다.

  • redisObjec은 두 수준의 데이터 구조를 연결하는 브리지입니다.

  • 여러 데이터 유형에 대한 통합 표현을 제공합니다.

  • 경우에 따라 메모리를 최대한 절약하기 위해 동일한 유형의 데이터가 다른 내부 표현을 사용할 수 있도록 허용합니다.

  • 객체 공유 및 참조 계산을 지원합니다. 객체가 공유되면 하나의 메모리 복사본만 사용되므로 메모리가 더욱 절약됩니다.

위 내용은 Redis의 객체 구조를 정의하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 yisu.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제