Redis 데이터 구조의 원리는 무엇입니까?

WBOY
풀어 주다: 2023-05-28 22:26:27
앞으로
1339명이 탐색했습니다.

    RedisDb

    Redis 서버에는 기본적으로 16개의 데이터베이스가 있으며, 하나의 데이터베이스는 하나의 RedisDB 데이터 구조에 해당합니다.

    typedef struct redisDb {
        dict *dict;
        dict *expires;
        dict * blocking_keys;
        dict * ready_keys;
        dict * watched_keys;
        ......
    }
    로그인 후 복사
    • dict: 키 공간 해시 테이블, 모든 키-값 쌍을 저장하는 데 사용됨

    • expires: 만료 시간 해시 테이블, 키 만료 시간 저장

    • blocking_keys: 차단 상태의 키 및 해당 키 클라이언트

    • ready_keys: Blocking_keys 속성에 상대적인 키 및 해당 클라이언트 차단 해제

    • watched_keys: 주로 트랜잭션에 사용되는 감시 키 및 해당 클라이언트

    RedisObject

    Redis 키 값은 모두입니다. redisObject 객체. Redis 데이터베이스에 새로운 키-값 쌍을 생성할 때마다 키 이름에 대한 redisObject 객체와 키 값에 대한 redisObject 객체가 생성됩니다

    trpedef struct RedisObject {
        int4 type;
        int4 encoding;
        void *ptr;
        int24 lru;
        int32 refcount;
    }
    로그인 후 복사
    encoding
    FieldDescription 설명
    type은 Enumerations
    internal 인코딩int, embstr로 표현되는 Redis string, list, hash, set, zset, stream 등에 해당하는 유형을 나타내는 데 사용됩니다. , raw, hashtable, Quicklist, ziplist, intset, skilist 등, 열거형으로 표현
    lru24비트, 선택적 LFU 또는 LRULRU인 경우 마지막 액세스 시간을 나타냅니다. LFU에서 상위 16비트는 분 단위로 액세스 시간을 표시하는 데 사용되며, 하위 8비트는 액세스 빈도를 표시하는 데 사용됩니다. 증가; 액세스 시간이 업데이트되면 액세스 빈도가 감쇠될 확률이 있습니다. (둘 다 공통) 접근 시간은 숫자의 모듈로이고, 현재 시간도 접근 시간보다 크면, 현재 시간이 그보다 작으면 두 숫자의 차이입니다. 액세스 시간은 현재 시간에 모듈러스와 액세스 시간을 더한 값입니다. 차이
    refcount 참조 카운트 의 초기 값은 1이며, 이는 실제 애플리케이션에서 참조 의미가 거의 없습니다
    ptr8바이트를 차지하는 포인터는 데이터 dict, 만료 등의 주소를 가리킵니다. 포인터는 RedisObject의 관련 작업인 동일한 주소

    object 명령을 가리킵니다.

    메모리 제거 전략 수정

    객체 유휴 시간 키 # 키의 유휴 시간, 즉 마지막으로 키를 읽고 쓴 이후의 시간에 대한 대략적인 설명을 반환합니다. lfu 모드에서는 사용할 수 없습니다.

    int

    문자열 값이 정수이고 이하인 경우 long의 최대값이 int 유형이고 ptr이 직접 int 유형 주소를 가리키는 embstr 및 raw

    Redis. SDS(Simple Dynamic String, simple string)라고 하며, 정수가 아닌 문자열 값

    config set maxmemory-policy volatile-lfu # 修改内存淘汰策略
    set name zhangsan
    object freq name # 获取计数值,仅lfu模式下可用,初始化为5
    
    get name
    
    object freq name # 再次访问,返回为6
    로그인 후 복사
    에 해당합니다.

    SDS는 Java의 ArrayList 구조

    와 유사하다는 것을 알 수 있습니다. 길이가 초과됩니다.

    Redis에서는 문자열 길이가 512M를 초과할 수 없다고 규정합니다. 길이가 특히 짧은 경우에는 embstr 형식을 사용하여 저장하고, 길이가 44바이트를 초과하는 경우에는 원시 형식을 사용하여 저장합니다.

    메모리 할당자의 최대 할당 단위는 64바이트, RedisObject는 16바이트, SDS 식별자는 3바이트를 차지하고 NULL로 끝나는 문자열에는 1바이트가 필요한 것으로 알려져 있으므로 문자열 길이가 작거나 같을 때 44까지는 메모리를 한 번만 할당하면 됩니다. RedisObject와 SDS는 동일한 메모리 유닛에 있으며, 이 데이터 구조를 embstr이라고 하며, 동일한 메모리 유닛에 있지 않은 데이터 구조를 raw라고 합니다.

    dict

    dict(인코딩은 해시테이블 유형, 사전) hash, set, zset(값과 점수 사이의 매핑을 저장하는 데 사용됨) 컬렉션에 해당합니다.

    dict는 Java의 HashMap 구조

    와 유사합니다. 차이점은 HashMap 확장이 배열을 적용한 다음 이전 데이터를 탐색하고 다시 해시하여 배열 아래에 걸어놓는다는 점입니다. 이렇게 시간이 많이 걸리는 프로세스를 견디기 어렵기 때문에 두 개의 배열을 사용하여 먼저 반환한 다음, 이동이 완료되면 데이터를 조금씩 이동합니다. 이 프로세스를

    프로그레시브라고 합니다. 재해시. 아아아아

    위 내용은 Redis 데이터 구조의 원리는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

    관련 라벨:
    원천:yisu.com
    본 웹사이트의 성명
    본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
    인기 튜토리얼
    더>
    최신 다운로드
    더>
    웹 효과
    웹사이트 소스 코드
    웹사이트 자료
    프론트엔드 템플릿
    회사 소개 부인 성명 Sitemap
    PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!