복붙노트

[REDIS] 레디 스에 사용되는 기본 데이터 구조는 무엇입니까?

REDIS

레디 스에 사용되는 기본 데이터 구조는 무엇입니까?

나는 최종 목록에서이 질문에 대답하기 위해 노력하고있어 :

그래서, 내가 읽은 레디 스리스트는 실제로 연결리스트로 구현됩니다. 그러나 다른 유형의, 나는 어떤 정보를 발굴 할 수 아니에요. 누군가가이 질문에 우연히 발견하고 장점과 수정하거나 다른 데이터 구조에 접근의 단점 높은 수준의 요약이없는 것 인 경우에 또한, 그들은 때 기준에 가장 잘 사용하는 특정 유형에 대한뿐만 아니라의 전체 목록이있을 것이다.

문자열,리스트, 세트, ​​ZSET 및 해시 : 특히, 나는 모든 종류의 윤곽을 찾고 있어요.

아, 지금까지, 다른 사람의 사이에서,이 글을 검토 한 결과 :

해결법

  1. ==============================

    1.나는 귀하의 질문에 대답하려고합니다,하지만 난 처음에는 이상하게 보일 수 있습니다 뭔가를 시작합니다 : 당신은 레디 스 내부에 관심이없는 경우 데이터 형식을 내부적으로 구현하는 방법에 대해 신경 안된다. 이것은 간단한 이유입니다 : 모든 레디 스 작업에 당신은 문서의 시간 복잡도를 찾아, 당신은 작업의 설정과 시간 복잡도가있는 경우, 당신이 필요로하는 유일한 것은 메모리 사용에 대한 몇 가지 단서 (그리고 것이기 때문에 우리는 데이터에 따라 달라질 수 많은 최적화를 수행 후자의 수치를 얻을 수있는 가장 좋은 방법은) 몇 가지 사소한 실제 테스트를하고있다.

    나는 귀하의 질문에 대답하려고합니다,하지만 난 처음에는 이상하게 보일 수 있습니다 뭔가를 시작합니다 : 당신은 레디 스 내부에 관심이없는 경우 데이터 형식을 내부적으로 구현하는 방법에 대해 신경 안된다. 이것은 간단한 이유입니다 : 모든 레디 스 작업에 당신은 문서의 시간 복잡도를 찾아, 당신은 작업의 설정과 시간 복잡도가있는 경우, 당신이 필요로하는 유일한 것은 메모리 사용에 대한 몇 가지 단서 (그리고 것이기 때문에 우리는 데이터에 따라 달라질 수 많은 최적화를 수행 후자의 수치를 얻을 수있는 가장 좋은 방법은) 몇 가지 사소한 실제 테스트를하고있다.

    당신이 요청하지만 이후, 여기에 모든 레디 스 데이터 형식의 기본이되는 구현입니다.

    목록, 집합 및 정렬 된 세트 아이템의 수와 최대 값의 크기가 작을 때, 다른, 훨씬 더 컴팩트 인코딩이 사용됩니다. 이 인코딩은 다른 유형에 따라 다를 수 있지만, 종종 모든 동작 스캔 하 O (N)를 강제로 데이터 압축 블롭이 있다는 특징을 갖는다. 우리는 작은 물체 만이 형식을 사용하기 때문에이 문제가되지 않습니다; 작은 O (N) 블롭을 스캐닝하는 캐시이다 잊기 때문에 실제로는 매우 빠르고 말하기, 너무 많은 요소가 존재할 때 인코딩 자동 (등에 링크 된리스트, 해시 등)이 기본 인코딩으로 스위칭된다.

    그러나 귀하의 질문에 정말 그냥 내부에 대한 당신의 포인트는 어떤 종류의 무엇을 달성하기 위해 사용하는 것이었다하지 않았다?

    이것은 모든 종류의 기본 유형입니다. 이 목록은 문자열 목록이기 때문에, Set를 문자열의 집합이며, 등, 네 가지 유형 중 하나뿐만 아니라 복잡한 유형의 기본 유형입니다.

    레디 스의 문자열은 HTML 페이지를 저장하려는 모든 명백한 시나리오에서 좋은 아이디어이지만, 또한 당신은 이미 인코딩 된 데이터를 변환하지 않도록 할 때. 그래서 예를 들어, 당신은 JSON 또는 MessagePack이 있다면 당신은 문자열로 객체를 저장할 수 있습니다. 레디 스 2.6에서는 심지어 루아 스크립트를 사용하여 객체의 서버 측의이 종류를 조작 할 수 있습니다.

    문자열의 또 다른 흥미로운 사용은 바이트, 또는 단일 비트의 액세스 임의 범위로 레디 스 수출 명령 이후, 비트 맵이며, 바이트의 일반 랜덤 액세스 배열한다. 레디 스를 사용하여 쉽고 빠르게 실시간 측정 : 예를 들어이 좋은 블로그 게시물을 확인합니다.

    근처 꼬리, 또는 가까운 머리 : 당신이 목록의 극단을 접촉 할 가능성이있는 경우 목록이 좋다. 랜덤 액세스 속도가 느린, O (N)이 있기 때문에리스트는 PAGINATE 물건에 아주 좋지 않다. 목록 그래서 좋은 용도는 일반 큐와 스택, 또는 "회전"항목의 반지 같은 소스 및 대상과 RPOPLPUSH를 사용하여 루프에서 처리하는 항목입니다.

    우리는 우리가 맨 위 또는 맨 아래 항목에 액세스 할 경우 대개 N 항목의 덮인 모음을 만들 때 목록도 좋은, 또는 N이 작은 경우.

    그들은 당신이 항목의 컬렉션을 가질 때마다 좋은 매우 빠른 방법으로 존재 또는 컬렉션의 크기를 확인하는 것이 매우 중요합니다 그래서 세트, 정렬되지 않은 데이터 모음입니다. 세트에 대한 또 다른 멋진 일이 임의 요소 (SRANDMEMBER 및 SPOP 명령)을 엿이나 터지는에 대한 지원이다.

    설정은 "사용자 X의 친구가 무엇인가?", 예를 들어,도 관계를 나타내는 좋은입니다 기타 등등. 그러나 이런 종류의 물건에 대한 다른 좋은 데이터 구조는 우리가 볼로 정렬 된 세트입니다.

    이 데이터를 가지고 당신이 어떤 결과를 얻기 위해 해당 데이터에 대한 변환을 수행 할 때, "계산"방식으로 레디 스를 사용하기위한 좋은 데이터 구조입니다, 그래서 세트, 등등 교차로, 노조와 같은 복잡한 작업을 지원합니다.

    작은 세트는 매우 효율적인 방식으로 인코딩됩니다.

    해시 필드 및 값 구성된 물체를 표현하는 완전한 데이터 구조이다. 해시의 필드는 또한 원자 HINCRBY를 사용하여 증가 될 수있다. 당신은 사용자, 블로그 게시물, 또는 항목을 다른 종류의 같은 개체가있을 때, 해시 가능성은 JSON 또는 이와 유사한 같은 자신의 인코딩을 사용하지 않으려면 갈 수있는 방법입니다.

    그러나 작은 해시가 레디 스에 의해 매우 효율적으로 인코딩 된 것을 명심, 당신은 원자 적으로 매우 빠른 방식으로, SET 또는 증가 개별 필드를 얻기 위해 레디 스를 요청할 수 있습니다.

    해시는 참조를 사용하여 링크 된 데이터 구조를 나타내는 데 사용할 수 있습니다. 예를 들어 의견의 lamernews.com 구현을 확인하십시오.

    정렬 된 세트는 주문 요소를 유지하기 위해, 목록 외에 유일한 다른 데이터 구조입니다. 당신은 정렬 된 세트로 멋진 물건의 숫자를 할 수 있습니다. 예를 들어, 당신은 당신의 웹 애플리케이션의 최고 무언가 목록의 모든 종류를 가질 수 있습니다. 점수에 의하여 정상 사용자, 페이지 뷰에 의해 상위 게시물, 단일 레디 스 인스턴스가 삽입의 톤을 지원받을 탑 요소 작업을 초당 것 무엇이든,하지만 최고.

    정렬 된 세트는 일반 세트와 같은 관계를 설명하는데 사용될 수 있지만, 그들은 또한 당신이 항목의 목록을 페이지를 매기하고 순서를 기억 할 수 있습니다. 나는 소트 세트와 사용자 X의 친구를 기억한다면 예를 들어, 난 쉽게 허용 우정의 순서대로 기억 할 수 있습니다.

    정렬 된 세트는 우선 순위 큐에 좋다.

    항상 빠르고, 삽입, 삭제, 또는 목록의 중간에서 범위를 얻는 곳 정렬 된 세트는 더 강력한 목록 같다. 그러나 더 많은 메모리를 사용하고, O (로그 (N))의 데이터 구조이다.

    나는이 게시물에 몇 가지 정보를 제공하는 것을 희망하지만, http://github.com/antirez/lamernews에서 lamernews의 소스 코드를 다운로드하고 어떻게 작동하는지 이해하는 것이 훨씬 낫다. 레디 스에서 많은 데이터 구조 멍청한 뉴스 내부에 사용되며, 주어진 과제를 해결하기 위해 사용하는 것에 대한 많은 단서가있다.

    죄송 문법 오타를 들어,이 골대를 검토하려면 여기를 너무 피곤 자정)

  2. ==============================

    2.대부분의 시간, 당신은 레디 스에서 사용되는 기본 데이터 구조를 이해 할 필요가 없습니다. 그러나 지식의 비트는 CPU의 V / s의 메모리 무역 오프를 확인하는 데 도움이됩니다. 그것은 또한 당신이 효율적인 방법으로 데이터를 모델링하는 데 도움이됩니다.

    대부분의 시간, 당신은 레디 스에서 사용되는 기본 데이터 구조를 이해 할 필요가 없습니다. 그러나 지식의 비트는 CPU의 V / s의 메모리 무역 오프를 확인하는 데 도움이됩니다. 그것은 또한 당신이 효율적인 방법으로 데이터를 모델링하는 데 도움이됩니다.

    내부적으로, 레디 스 다음과 같은 데이터 구조를 사용합니다 :

    특정 키를 사용하여 인코딩을 찾기 위해 명령 객체 인코딩 <키>를 사용한다.

    레디 스에서 문자열은 간단한 동적 문자열, 또는 SDS이라고합니다. 그것은 당신이 문자열과 접두사로 무료 바이트 수의 길이를 저장할 수 숯불 *에 비해 좀 작은 래퍼입니다.

    문자열의 길이가 저장되기 때문에, 나 strlen 오 (1) 동작이다. 길이가 알려져 있기 때문에, 레디 스 문자열이 바이너리 안전합니다. 문자열이 널 (null) 문자를 포함하는 것은 완벽하게 합법적이다.

    문자열은 레디 스에서 사용할 수있는 가장 다양한 데이터 구조입니다. 문자열 다음의 모든입니다 :

    레디 스에는 다음의 사전을 사용합니다 :

    레디 스 사전은 해시 테이블을 사용하여 구현된다. 대신 구현을 설명, 난 그냥 레디 스 특정 물건을 설명합니다 :

    설정 데이터 구조에는 중복이없는 보장하기 위해 사전을 사용합니다. 정렬 집합 ZSCORE는 O (1) 연산이다 왜 그 점수로 된 요소에 매핑하는 사전을 이용한다.

    리스트 데이터 유형은 이중 연결리스트를 이용하여 구현된다. 레디 스 '구현은 직선에서 - 더 - 알고리즘 교과서입니다. 유일한 변경 레디 스리스트 데이터 구조의 길이를 저장한다는 것이다. LLEN는 O (1)의 복잡성을 가지고 있음이 보장한다.

    레디 스 정렬 세트의 기본 데이터 구조로서 스킵리스트를 사용한다. 위키 백과는 좋은 소개가 있습니다. 윌리엄 푸의 논문 건너 뛰기 목록 : 확률 대체 균형 나무에 대한 더 자세한 내용이 있습니다.

    정렬 된 세트 건너 뛰기 목록과 사전을 모두 사용합니다. 사전 저장 각 요소의 점수.

    레디 스 '건너 뛰기 목록 구현은 다음과 같은 방법으로 표준 구현 다릅니다 :

    이 포인터와 데이터를 저장 인라인을 사용하지 않는 것을 제외하고 우편 목록은 이중 연결리스트 같다.

    하나의 순방향 포인터, 하나 후방 포인터 및 포인터 한 그 노드에 저장된 데이터를 참조 - 3 포인터에 이중 연결리스트의 각 노드 갖는다. 포인터는 메모리 (64 비트 시스템에서 8 바이트)를 필요로하고, 이렇게 작은리스트를 들어, 이중 연결리스트는 매우 비효율적이다.

    레디 스 문자열에서 순차적으로 우편 목록을 저장 요소. 각 요소는 저장 요소의 길이, 데이터 타입은 다음 요소에 대한 오프셋과 이전의 오프셋 소자 작은 헤더를 갖는다. 이 오프셋은 전후 포인터를 교체합니다. 데이터가 인라인 저장되어 있기 때문에, 우리는 데이터 포인터가 필요하지 않습니다.

    우편 목록은 작은 목록, 정렬 된 세트와 해시를 저장하는 데 사용됩니다. 정렬 된 세트 [에서 element1, score1, element2에, score2, element3, score3] 추천리스트로 평탄화 및 우편 번호리스트에 저장된다. 해시는 [KEY1, 값 1, 키 2, 값 2] 등을 추천리스트로 병합 부

    우편 번호 목록을 사용하면 CPU와 메모리 사이의 절충을 할 수있는 힘이있다. 우편 번호 목록은 메모리 효율적입니다,하지만 그들은 연결리스트 (또는 해시 테이블 / 건너 뛰기 목록)보다 더 많은 CPU를 사용합니다. 우편리스트의 요소를 찾기 O (N)이다. 새로운 요소를 삽입하면 메모리를 재 할당해야합니다. 이 때문에, 레디 스 단지 작은 그룹, 해시 및 집합을 정렬이 인코딩을 사용한다. 당신은 redis.conf에> <데이터 형식> - 최대-ziplist-항목과 <데이터 형식> - 최대-ziplist 값의 값을 변경하여이 동작을 조정할 수 있습니다. 참조 레디 스 메모리 최적화, 섹션 자세한 내용은 "작은 집계 데이터 유형의 특수 인코딩".

    ziplist.c의 의견은 우수, 당신은 코드를 읽을 필요없이 완전히이 데이터 구조를 이해할 수있다.

    Int 인 세트 "정렬 된 정수 배열"에 대한 멋진 이름입니다.

    레디 스에서 세트는 일반적으로 해시 테이블을 사용하여 구현된다. 작은 세트의 경우, 해시 테이블은 현명한 비효율적 인 메모리입니다. 세트 만 정수로 구성 될 때, 배열은 종종보다 효율적이다.

    int로 설정 정수의 정렬 된 배열입니다. 이진 검색 알고리즘이 사용되는 요소를 찾을 수 있습니다. 이 O (N 로그)의 복잡도를 갖는다. 이 배열에 새로운 정수를 추가하면 큰 정수 배열에 대한 비용이 될 수있는 메모리 재 할당을 요구할 수있다.

    16 비트, 32 비트 및 64 비트 : 다른 메모리 최적화로서, 지능 세트는 서로 다른 크기의 정수 3 개 변형 들어온다. 레디 스는 요소의 크기에 따라 적절한 변형을 사용하는 스마트 충분하다. 새로운 요소가 추가하고 현재 크기를 초과하는 경우, 레디 스 자동으로 다음 크기로 마이그레이션합니다. 문자열이 추가되면, 레디 스 자동으로 정규 해시 테이블을 기반으로 세트에 지능 설정을 변환합니다.

    지능 설정은 CPU와 메모리 사이의 트레이드 오프입니다. 지능 설정은 매우 메모리 효율적이며, 작은 세트의 그들은 빠른 해시 테이블보다. 그러나 요소의 특정 숫자 후 O는 검색 시간을 너무 많이하게 재 할당 메모리의 비용을 (N 로그). 실험을 바탕으로, 정규 해시 테이블로 전환 할 수있는 최적의 임계 값은 512 그러나, 당신은 응용 프로그램의 필요에 따라 (가 이해가되지 않습니다 감소)이 임계 값을 증가시킬 수 것으로 밝혀졌다. redis.conf의 설정 최대-intset-항목을 참조하십시오.

    우편 번호지도는 사전을 평평 목록에 저장됩니다. 그들은 우편 번호 목록과 매우 유사하다.

    우편 번호지도 레디 스 2.6부터 사용되지 않습니다, 작은 해시 우편 번호 목록에 저장됩니다. 이 인코딩에 대한 자세한 내용은 zipmap.c의 주석을 참조하십시오.

  3. ==============================

    3.값을 가리키는 저장 키를 레디 스. 키 (가독성 및 디버깅을 위해 추천 짧은 ASCII 문자열을 사용) 적당한 크기에 대한 이진 값까지 될 수 있습니다. 값은 다섯 개 가지 기본 레디 스 데이터 유형 중 하나입니다.

    값을 가리키는 저장 키를 레디 스. 키 (가독성 및 디버깅을 위해 추천 짧은 ASCII 문자열을 사용) 적당한 크기에 대한 이진 값까지 될 수 있습니다. 값은 다섯 개 가지 기본 레디 스 데이터 유형 중 하나입니다.

    문자열

    레디 스 문자열은 일련의 바이트입니다.

    레디 스에서 문자열은 하나의 문자열 512 메가 바이트 아무것도 저장할 수 있도록 바이너리 안전 (그들은 특별한 종단 문자에 의해 결정되지 알려진 길이를 의미)이다.

    문자열은 정식 "키 값 저장소"개념입니다. 당신은 키와 값 모두 텍스트 또는 바이너리 문자열 값, 열쇠를 가리키는 있습니다.

    문자열에 가능한 모든 조작의 경우, 참조 http://redis.io/commands/#string

    해시

    레디 스 해시 키 값 쌍의 컬렉션이다.

    레디 스 해시는 각 키와 값이 문자열 많은 키 값 쌍을 보유하고있다. 레디 스의 해시가 직접 복잡한 값을 지원하지 않습니다 (의미를, 당신은 해시 필드가 목록 또는 세트 또는 다른 해시 값을 가질 수 없습니다),하지만 당신은 다른 최고 수준의 복잡한 값을 포인트로 해시 필드를 사용할 수 있습니다. 당신이 해시 필드 값에 대해 수행 할 수있는 유일한 특별한 작업은 숫자 내용의 원자 증가 / 감소합니다.

    두 가지 방법으로 레디 스 해시 생각할 수 있습니다 : 직접 객체 표현으로 컴팩트하게 많은 작은 값을 저장하는 방법으로.

    직접 객체 표현은 이해하기 간단합니다. 객체는 이름 (해시 키)와 함께, 내부 키 값의 집합을 갖는다. , 음, 예를 들어 아래의 예를 참조하십시오.

    해시를 사용하는 많은 작은 값을 저장하는 것은 현명 레디 스 대용량 데이터 저장 기법이다. 해시 필드 소수 (~ 100)를 갖는 경우, 레디 스 전체의 해시를 저장 및 액세스 효율성 고체를 최적화한다. 레디 스의 작은 해시 스토리지 최적화는 흥미로운 문제를 제기 오히려 문자열 값을 가리키는 만 최고 수준의 키를 가진보다 100 내부 키와 값이 100 해시 각을 가지고하는 것이 더 효율적입니다. 레디 스이 방법은 데이터가 끝나는 추적하기위한 추가 프로그래밍 오버 헤드를 필요로하지 데이터 스토리지를 최적화하기 위해 해시를 사용하지만 데이터 스토리지 기반 primarly 문자열 인 경우, 당신은 오버 헤드를 하나 개의 이상한 트릭을 사용하여 메모리를 많이 절약 할 수 있습니다.

    해시에 가능한 모든 작업의 ​​경우, 해시 문서를 참조

    기울기

    레디 스리스트는 연결리스트와 같은 역할을합니다.

    당신은에서 삭제할 삽입하고 머리 또는 목록의 꼬리 중 하나에서 트래버스 목록 수 있습니다.

    당신은 그들이 삽입 된 순서대로 값을 유지해야 할 때 목록을 사용합니다. (레디 스 당신에게 당신이 필요로하는 경우 임의의 목록 위치에 삽입 할 수있는 옵션을 제공하지 않습니다,하지만 당신은 당신의 시작 위치에서 멀리 삽입 할 경우 삽입 성능이 저하됩니다.)

    레디 스 목록은 종종 생산자 / 소비자 대기열로 사용됩니다. 목록에 항목을 삽입 한 다음 목록에서 항목을 팝업. 당신의 소비자가 어떤 요소 목록에서 팝업하려고하면 어떻게됩니까? 당신은 표시하고이 추가됩니다 때 즉시로 돌아 요소를 기다리는 레디 스를 요청할 수 있습니다. 이것은 실시간으로 메시지 큐 / 이벤트 / 직무 / 작업 / 알림 시스템에 레디 스를 켭니다.

    당신은 원자 스택 또는 큐으로 처리 할 수있는 목록을 가능 목록의 양쪽 끝에 떨어져 요소를 제거 할 수 있습니다.

    당신은 또한 모든 삽입 후 특정 크기로 목록을 트리밍하여 고정 길이리스트 (덮인 컬렉션)를 유지 관리 할 수 ​​있습니다.

    목록에 가능한 모든 작업의 ​​경우, 목록의 문서를 참조

    설정

    레디 스 세트는, 음, 집합입니다.

    레디 스 세트는 각 문자열은 세트 당 한 번만 존재하는 고유의 정렬되지 않은 레디 스 문자열이 포함되어 있습니다. 당신이 세트 같은 요소 열 시간을 추가하면 한 번만 표시됩니다. 세트 게으르게 적어도 한 번 축적과 공간을 낭비하고 중복 요소에 대한 걱정없이 무언가가 존재 확보를 위해 중대하다. 당신은 이미 존재 여부를 확인하지 않고처럼 여러 번 같은 문자열을 추가 할 수 있습니다.

    세트 회원 확인, 삽입 및 세트의 구성원 삭제 빠르다.

    사용자가 예상하는대로 세트, 효율적인 설정 작업을해야합니다. 한 번에 노동 조합, 교차로, 여러 세트의 차이를 취할 수 있습니다. 결과 중 하나를 호출자에게 반환 할 수 있습니다 또는 결과는 나중에 사용에 대한 새로운 세트에 저장할 수 있습니다.

    세트 (목록 달리) 회원 확인을 위해 일정 시간 접속이 있고, 레디 스도 편리 임의의 구성원 제거 및 반환 ( "집합에서 임의의 요소를 팝업") 또는 (교체없이 돌아 임의의 구성원을 가지고 "나에게 30 임의 틱 고유 한 사용자를 제공 ") 또는 교체와 함께 ("나에게 7 개 카드를 제공하지만, 각 선택 후, 잠재적으로 "다시 샘플링 할 수 있도록 카드 등을 넣어).

    세트에 가능한 모든 작업의 ​​경우, 세트의 문서를 참조하십시오.

    정렬 설정

    레디 스는 세트가 사용자 정의 순서와 집합입니다 분류.

    단순화하기 위해, 당신은 독특한 요소를 이진 트리로 소트 세트 생각할 수 있습니다. (레디 스는 세트가 실제로 목록을 건너 뛸 수 있습니다 분류.) 요소의 정렬 순서는 각 요소의 점수에 의해 정의된다.

    정렬 된 세트는 여전히 집합입니다. 요소 집합 만에 한 번 나타날 수 있습니다. 의 요소는, 고유성을 위해, 캐릭터 라인의 내용에 의해 정의된다. 당신의 소트 세트의 점수 (500)를 정렬하여 점수 하나 개의 요소 "사과"500 개 결과를 정렬하여 요소 "사과"를 한 후, 점수 3 정렬 삽입과 요소 "사과"를 삽입. 세트하지 (점수, 데이터) 쌍, 데이터를 기반으로 만 고유합니다.

    만들기는 반드시 데이터 모델은 고유성에 대한 요소의 점수 문자열 내용과하지에 의존합니다. 점수는 반복 될 수 (또는 제로)하지만, 마지막으로는, 설정 요소는 소트 세트 당 한 번만 존재할 수있다. 당신이 만들어 정렬 된 집합으로 모든 사용자 로그인의 기록을 저장하려고하면 예를 들어, 로그인 및 사용자 ID, 당신은 모든 사용자를 위해 마지막 로그인 시대를 저장 끝날 값의 시대 점수. 귀하의 설정은 사용자 기반 크기와 userbase가의 *에 로그인하지 원하는 크기로 성장할 것입니다.

    요소 점수와 세트에 추가됩니다. 당신은 언제든지 요소의 점수를 업데이트 단지 새로운 점수를 다시 요소를 추가 할 수 있습니다. 필요한 경우 점수가 점의 복식을 부동으로 표현된다, 그래서 당신은 고정밀 타임 스탬프의 단위를 지정할 수 있습니다. 여러 요소가 동일한 점수를 가질 수있다.

    당신은 몇 가지 방법의 요소를 검색 할 수 있습니다. 모든 정렬되어 있기 때문에, 당신은 가장 낮은 점수에서 시작 요소를 요청할 수 있습니다. 당신은 ( "역") 가장 높은 점수에서 시작 요소를 요청할 수 있습니다. 당신도 자연 또는 역순으로 자신의 정렬 점수에 의한 요소를 요청할 수 있습니다.

    분류 세트에 가능한 모든 작업의 ​​경우, 정렬 된 세트의 문서를 참조하십시오.

  4. from https://stackoverflow.com/questions/9625246/what-are-the-underlying-data-structures-used-for-redis by cc-by-sa and MIT license