Redis의 성능이 뛰어난 이유 중 하나는 각 데이터 구조가 하나 이상의 데이터 구조에 의해 특별히 설계되고 지원된다는 점입니다. 읽기 및 쓰기 성능을 향상시키는 유연한 데이터 구조입니다. Redis의 데이터 구조는 두 가지 다른 관점에서 논의될 수 있습니다
첫 번째 수준은 사용자 관점입니다. 이 수준은 Redis가 외부에 노출하는 문자열, 목록, 해시, 집합 등의 호출 인터페이스이기도 합니다. 정렬된 세트입니다.
두 번째 수준은 내부 구현의 관점에서 볼 때 dict, sds, ziplist, Quicklist, Skiplist, intset과 같은 하위 수준 구현입니다.
Redis 사용자의 관점에서 Redis 노드에는 여러 데이터베이스가 포함됩니다(기본값은 비클러스터 모드에서 16개이고 클러스터 모드에서는 1개만 가능). 키 공간에서 객체 공간으로의 매핑 관계를 유지합니다. 이 매핑 관계의 키는 문자열 유형이며 값은 문자열, 목록, 해시, 집합, 정렬된 집합 등과 같은 여러 데이터 유형일 수 있습니다. 키 유형은 항상 문자열이지만 값은 여러 유형일 수 있습니다.
Redis의 내부 구현 관점에서 데이터베이스 내 매핑 관계는 dict를 사용하여 유지됩니다. dict의 키가 동적 문자열 sds인 고정 데이터 구조로 표현되는 것으로 충분합니다. 값은 더 복잡합니다. 동일한 dict에 다양한 유형의 값을 저장하려면 범용 데이터 구조가 필요합니다. 이 범용 데이터 구조는 robj이고 전체 이름은 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;
OBJ_HASH. 이는 각각 Redis에서 공개하는 5가지 데이터 구조에 해당합니다.
동일한 유형이 서로 다른 인코딩에 해당할 수도 있습니다. 이는 동일한 데이터 유형이 서로 다른 내부 표현을 가질 수 있음을 의미합니다. 내부 표현이 다르면 메모리 사용량과 검색 성능이 다릅니다.
type = OBJ_STRING이면 이 robj가 문자열을 저장한다는 의미입니다. 이때 인코딩은 다음 세 가지 유형 중 하나일 수 있습니다.OBJ_ENCODING_QUICKLIST: 퀵리스트로 표현됩니다. 목록 데이터 구조에 사용됩니다.
redisObject의 역할은 다음과 같습니다.
redisObjec은 두 수준의 데이터 구조를 연결하는 브리지입니다.
여러 데이터 유형에 대한 통합 표현을 제공합니다.
경우에 따라 메모리를 최대한 절약하기 위해 동일한 유형의 데이터가 다른 내부 표현을 사용할 수 있도록 허용합니다.
객체 공유 및 참조 계산을 지원합니다. 객체가 공유되면 하나의 메모리 복사본만 사용되므로 메모리가 더욱 절약됩니다.
위 내용은 Redis의 객체 구조를 정의하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!