首頁 > 資料庫 > Redis > 主體

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:處於阻塞狀態的鍵與對應的client

    • ready_keys:解除阻塞狀態的鍵與對應的client,與blocking_keys屬性相對

    • watched_keys:watch的鍵和對應的client,主要用於事務

    RedisObject

    Redis的鍵值都是redisObject對象,每次當我們在Redis的資料庫中新建立一個鍵值對時,都會產生一個用於鍵名的redisObject對象和一個用於鍵值的redisObject對象

    trpedef struct RedisObject {
        int4 type;
        int4 encoding;
        void *ptr;
        int24 lru;
        int32 refcount;
    }
    登入後複製
    欄位描述說明
    #type用於表示Redis對應的類型string、list、hash、set、zset、stream等,用枚舉表示
    #encoding內部編碼int ,embstr,raw,hashtable,quicklist, ziplist,intset,skiplist等,用枚舉表示
    lru24位,可選LFU或LRU 當為LRU時,表示最後一次訪問時間;當為LFU時,高16位元用來表示分鐘級別的訪問時間,低8位用來表示訪問頻次,頻次的增加使用的是機率演算法,基數越大越難增加;訪問時間更新時,存在一定機率將訪問頻次衰減。 (兩者共有)訪問時間是對一個數取模,當前時間也取模, 當前時間大於訪問時間,則為兩數之差;當前時間小於訪問時間,則為當前時間加上模數與訪問時間之差
    refcount引用計數初始值為1,實際應用中參考意義不大
    #ptr指針,佔8個字節,指向資料的位址dict、expires等,指標指向同一個位址

    object指令,就是RedisObject的相關操作。

    修改記憶體淘汰策略

    object idletime key # 返回key的空閒時間,即上次讀寫鍵以來經過的近似描述,在lfu模式下不可用

    config set maxmemory-policy volatile-lfu # 修改内存淘汰策略
    set name zhangsan
    object freq name # 获取计数值,仅lfu模式下可用,初始化为5
    
    get name
    
    object freq name # 再次访问,返回为6
    登入後複製

    int

    當string值為整數且小於等於long的最大值時,encoding為int型,ptr直接指向該int型位址

    embstr與raw

    Redis的字串叫SDS(Simple Dynamic String,簡單字串),對應key,非整數型的String值

    trpedef struct SDS {
        int8 capacity; // 数组容量
        int8 len; // 实际长度
        int8 flags;
        byte[] content; // 数组内容
    }
    登入後複製

    可以看出,SDS與Java的ArrayList結構類似,也是分配初始長度,長度超出時擴容。 Redis規定字串的長度不能超過512M。

    當長度特別短時,使用embstr形式儲存;當長度超出44位元組時,使用raw形式儲存。

    已知記憶體分配器最大分配單位是64字節,RedisObject佔16個字節,SDS標識佔3個字節,字串以NULL結尾需要佔用一個字節,因此當字串長度小於等於44時,只需要分配一次記憶體。 RedisObject與SDS在同一記憶體單位,我們將這個資料結構稱為embstr,而不是在同一記憶體單位的,稱為raw。

    dict

    dict(encoding編碼為hashtable類型,字典)對應hash、set、zset(用於儲存value與score的映射)集合。

    dict與Java的HashMap結構類似,不同的是HashMap擴容是申請數組,然後遍歷,將舊資料重新hash後掛到數組下面,作為單線程的Redis很難承受這樣耗時的過程,所以它使用了兩個數組,先返回,然後空閒的時候一點一點搬數據,搬完之後再將舊數據清空,我們將這樣的過程成為漸進式rehash

    typedef struct dict {
        dictht ht[2];
    }
    登入後複製

    以上是Redis資料結構原理是什麼的詳細內容。更多資訊請關注PHP中文網其他相關文章!

    相關標籤:
    來源:yisu.com
    本網站聲明
    本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
    熱門教學
    更多>
    最新下載
    更多>
    網站特效
    網站源碼
    網站素材
    前端模板
    關於我們 免責聲明 Sitemap
    PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!