redis zskiplist 跳躍表原始碼學習

2021-10-02 08:24:48 字數 1713 閱讀 4452

typedef

struct zskiplistnode level;

// index越大表示層級越高

} zskiplistnode;

typedef

struct zskiplist zskiplist;

typedef

struct zset zset;

命令: zadd key score value

zskiplistnode *

zslinsert

(zskiplist *zsl,

double score, sds ele)

// 如果無法往後走了,走到下一層。記錄這一層卡住的節點(新高度超過原有最高高度時使用)

update[i]

= x }

// 計算節點的層級

level =

zslrandomlevel()

;// 如果出現新的高度,將原來記錄的節點指向新節點

if(level > zsl->level)

zsl->level = level;

}// 建立乙個跳躍表節點

x =zslcreatenode

(level, score, ele)

;for

(i =

0; i < level; i++

)/* increment span for untouched levels 增加跨度*/

for(i = level; i < zsl->level; i++

)/* 更新後退指標 */

x->backward =

(update[0]

== zsl->header)

?null

: update[0]

;if(x->level[0]

.forward)

x->level[0]

.forward->backward = x;

else

zsl->tail = x;

zsl->length++

;return x;

}

命令: zscore key value

從資料結構上可以看到,由於zset中存在乙個dict,獲取乙個value的得分,應該是直接從字典拿就可以了

int

zsetscore

(robj *zobj, sds member,

double

*score)

else

if(zobj->encoding == obj_encoding_skiplist)

else

return c_ok

}

從上面新增元素的過程中可以看到,乙個節點的每一層,都會記錄乙個span,這個span其實就代表了它在這一層和上個節點的間隔。rank的計算就是通過查詢元素的過程中累加這個間隔來得到的

unsigned

long

zslgetrank

(zskiplist *zsl,

double score, sds ele)

if(x->ele &&

sdscmp

(x->ele, ele)==0

)}return0;

}

參考資料

《redis深度歷險》

字母跳一跳

題目 有一無限長的迴圈字母表,任意輸入乙個字母,按照規定時刻進行跳轉,每個時刻跳轉規定的步數,最後顯示跳轉後得到的字母 include using namespace std int main char i word 輸入字母 int i k,i t,n 跳轉步數k,時間t,組數n cin n ch...

微信跳一跳python 微信跳一跳Python

1 安裝python,我用的是python2.7 5.安裝pillow,放在scripts資料夾中,通過 pip install pillow安裝 6.安裝adb工具包,可以直接放在專案 的資料夾裡面,或者放在c盤目錄不過要配置一下環境變數,我這裡是直接放在專案 資料夾中。內建了cmd 命令 7.把...

opencv版跳一跳

主要問題有三個 1.如何獲取遊戲資訊 2.如果對遊戲內容進行解析,提取關鍵資訊 3.如何對遊戲進行操作 下面給出演算法流程,隨後進行細節上的闡述。step1縮小影象尺寸,提取roi區域 step2根據顏色特徵檢測棋子,計算其形心。根據棋子形態固定的特徵,把形心向下移動一定的距離獲取底部中心p1 x0...