1. 程式人生 > >redis基本資料結構(2)

redis基本資料結構(2)

字典dict

dict的主要實現從低到高依賴以下三個資料結構:

//具體的hash表的一項,用指正組成一個連結串列
typedef struct dictEntry {
    void *key;//鍵
    //值,聯合體,可以使多種型別的值
    union {
        void *val;
        uint64_t u64;
        int64_t s64;
        double d;
    } v;
    struct dictEntry *next;//hash衝突時使用開鏈發解決衝突,指向下一個節點
} dictEntry;
//dict結構體中的hash表的描述結構體
typedef struct dictht { dictEntry **table;//指向dictEntry*的指標的陣列 unsigned long size;//hash表的大小,即陣列長度 unsigned long sizemask;//hash表大小的掩碼,用於計算索引 unsigned long used;//hash表已有的節點數 } dictht; //字典的主結構體 typedef struct dict { dictType *type; //如果這個字典有定義特殊的處理函式,則這個指標指向包含那些函式的指標的結構體 void *privdata;//私有資料
dictht ht[2];//hash表,當表長度不夠rehash時需要用到第二張表 long rehashidx; int iterators; } dict;

redis裡的字典在底層是用hash表來實現的,整個hash表的每一項的指標是一個地址連續的陣列,要傳入字典的引數根據相應的hash函式計算後儲存在這個陣列的某一項中,如果出現了hash衝突,則使用開鏈法解決,用struct dictEntry *next來組成一個連結串列,詳細結構如下:
這裡寫圖片描述

衝突解決與rehash
在使用開鏈法解決衝突問題的時候,連結串列的插入採用的是頭插法(速度上的考慮)。
隨著操作的不斷進行,hash表儲存的鍵值對一般會不斷地增加,為了讓表的負載因子維持在一個合理的範圍之內,就需要用rehash對整個hash表進行調整。
rehash的步驟一般分為三步:
1. 為dict的ht[1]分配空間,空間一般為ht[0]的兩倍
2. 通過重新計算hash的對映,把ht[0]裡的項對映到ht[1]中
3. 對映完成後,釋放ht[0]再把ht[1]賦給ht[0]。
由於rehash的整個過程會消耗大量時間,可能會導致整個redis在一段時間內停止服務,所以redis採取的是漸進式的rehash策略。在這種策略下,系統同時維持ht[0]和ht[1]兩個hash表,然後在後臺每隔n毫秒執行一次rehash的服務。rehash服務把ht[0]上的資料項rehash到ht[1]上,並做一下標識,直到rehash完畢。
rehash期間對dict的操作
由於rehash期間同時存在兩個hash表,所以需要特別考慮rehash期間對hash表的操作。rehash期間,如果存在對hash表的更新、查詢和刪除操作,則需要同時在兩個表中進行;如果存在對hash表的插入操作,則只在ht[1]中進行。

相關推薦

redis基本資料結構(2)

字典dict dict的主要實現從低到高依賴以下三個資料結構: //具體的hash表的一項,用指正組成一個連結串列 typedef struct dictEntry { void *key;//鍵 //值,聯合體,可以使多種型別的值

Redis基本資料結構及SpringBoot中使用redisTemplate操作Redis

文章目錄 一、Redis環境 1、環境:CentOS7.0,redis-4.0.2 2、首先啟動redis服務 二、Redis資料結構 1、string(字串) (1)鍵值對 (2)使用

Redis學習筆記之Redis基本資料結構

Redis基礎資料結構 Redis有5種基本資料結構:String(字串)、list(列表)、set(集合)、hash(雜湊)、zset(有序集合) 字串string 字串型別是Redis的value最簡單的資料結構,類似與Java語言中的ArrayList(數字列表),不過在Redis裡String是一種動

優先佇列的基本資料結構(2)

摘要:本次提供另外一些優先佇列的基本操作 【1】 對二叉堆進行下濾,就是讓某個元素降至到使得它符合二叉堆優先結構的節點. void PerLocateDown(Heap H,int i) //對二叉堆進行下濾 { int child;

Redis2)- 基本資料結構和操作

Redis的一個特點就是處理基本字串,還支援多種資料結構,包括Hash,List,Set,SortedSet。本章主要介紹Redis的資料結構和基本操作,並給出一些典型的使用場景。 1. 字串String 字串操作是Redis最基礎的操作。是二

Redis學習筆記之基本資料結構

Redis基礎資料結構 Redis有5種基本資料結構:String(字串)、list(列表)、set(集合)、hash(雜湊)、zset(有序集合) 字串string 字串型別是Redis的value最簡單的資料結構,類似與Java語言中的ArrayList(數

Redis六種基本資料結構的操作

一、String value是字串型別。 1.常用命令 set key value:設定key、value setex key seconds value:設定key、value,有效期seconds秒 setnx key value:設定key、v

Redis(1)——5種基本資料結構

一、Redis 簡介 "Redis is an open source (BSD licensed), in-memory data structure store, used as a database, cache and message broker." —— Redis是一個

R語言-基本資料結構的用法

關鍵詞:向量、矩陣、陣列、資料框、因子、列表 近期開始上手R語言,可能是出於對機器學習的興趣吧從而瞭解到這門語言; 之前也看過人生苦短的Python,當然這兩門語言都是人工智慧技術中很好的工具; 二者也存在一些相同之處,當然是除了開源之外的一些相同之處; 本人蔘考的書籍是R語言實戰[

初學hashmap資料結構2

remove方法 public V remove(Object key) { Entry<K,V> e = removeEntryForKey(key); //返回與key相同的前一個值, return (e == null ? null : e.value

基本資料結構第一篇——位運算

在所有現代cpu中都是以二進位制方式表示資料,所以使用位掩碼來計算的優點 1、更快的執行速度、 2、更簡潔的程式碼、 3、更少的佔用記憶體量 4、用陣列代替關聯陣列 首先是按位與 按位與(&) 對兩個數進行操作,然後返回一個新的數,這個數的每個位都需要兩個輸

基本資料結構――堆的基本概念及其操作

     轉載自:https://www.cnblogs.com/JVxie/p/4859889.html,同時感謝大佬的分析       在我剛聽到堆這個名詞的時候,我認為它是一堆東西的集合       但其實吧它是利用

資料結構2--線性表(java程式碼實現線性表的鏈式儲存)

1.鏈式儲存       2.分析       每個節點為一個物件,該物件包含資料域和指標域        整條單鏈表為一個物件,他和節點物件進行組合。  3.

Redis內部資料結構詳解——intset

本文是《Redis內部資料結構詳解》系列的第七篇。在本文中,我們圍繞一個Redis的內部資料結構——intset展開討論。 Redis裡面使用intset是為了實現集合(set)這種對外的資料結構。set結構類似於數學上的集合的概念,它包含的元素無序,且不能重複。Redis裡的set結構還實現了

Redis rdb資料結構 原始碼詳解

記錄下來以後方便回憶,需要時隨時翻閱 一、Redis  RDB檔案的資料結構  二、Redis  RDB檔案的十六進位制碼和對應的字元   三、Redis  save和bgsave命令處理過程  

Redis底層資料結構--SDS

這是一種用於儲存二進位制資料的一種結構, 具有動態擴容的特點. 其實現位於src/sds.h與src/sds.c中, 其關鍵定義如下: typedef char *sds; /* Note: sdshdr5 is never used, we just access the flags byt

Redis底層資料結構--連結串列

這是普通的連結串列實現, 連結串列結點不直接持有資料, 而是通過void *指標來間接的指向資料. 其實現位於 src/adlist.h與src/adlist.c中, 關鍵定義如下: typedef struct listNode { struct listNode *prev

Redis底層資料結構dict

dict是Redis底層資料結構中實現最為複雜的一個數據結構, 其功能類似於C++標準庫中的std::unordered_map, 其實現位於 src/dict.h 與 src/dict.c中, 其關鍵定義如下: typedef struct dictEntry {

Nginx基本資料結構之ngx_hash_keys_arrays_t

大家看到在構建一個ngx_hash_wildcard_t的時候,需要對萬用字元的哪些key進行預處理。這個處理起來比較麻煩。而當有一組key,這些裡面既有無萬用字元的key,也有包含萬用字元的key的時候。我們就需要構建三個hash表,一個包含普通的key的hash表,一個包含前向萬用字元的hash

Objective-C runtime機制(1)——基本資料結構:objc_object & objc_class

前言 從本篇文章開始,就進入runtime的正篇。 什麼是runtime? OC是一門動態語言,與C++這種靜態語言不同,靜態語言的各種資料結構在編譯期已經決定了,不能夠被修改。而動態語言卻可以使我們在程式執行期,動態的修改一個類的結構,如修改方法實現,繫結例項變數等。