新聞中心
Redis中的跳表是一種存儲結(jié)構(gòu),它可以優(yōu)化 Redis 的特定操作的性能,可用于存儲有序的元素集合。事實(shí)上,Redis 中的跳表就是一個實(shí)現(xiàn)了元素排序的數(shù)據(jù)結(jié)構(gòu),它的實(shí)現(xiàn)基于一種叫做“跳表”的數(shù)據(jù)結(jié)構(gòu),該數(shù)據(jù)結(jié)構(gòu)比標(biāo)準(zhǔn)的鏈表和數(shù)組數(shù)據(jù)結(jié)構(gòu)更加靈活且快速,它能夠根據(jù)關(guān)鍵字快速定位到元素,也能夠快速獲取有序列表中元素的范圍,從而提高 Redis 的查找性能。

創(chuàng)新互聯(lián)致力于成都網(wǎng)站制作、做網(wǎng)站,成都網(wǎng)站設(shè)計(jì),集團(tuán)網(wǎng)站建設(shè)等服務(wù)標(biāo)準(zhǔn)化,推過標(biāo)準(zhǔn)化降低中小企業(yè)的建站的成本,并持續(xù)提升建站的定制化服務(wù)水平進(jìn)行質(zhì)量交付,讓企業(yè)網(wǎng)站從市場競爭中脫穎而出。 選擇創(chuàng)新互聯(lián),就選擇了安全、穩(wěn)定、美觀的網(wǎng)站建設(shè)服務(wù)!
Redis 中的跳表是一個二叉樹,包含一系列索引和“真實(shí)值”(元素值)的節(jié)點(diǎn),每一個節(jié)點(diǎn)都有一個整數(shù)類型的索引和著一個指向“真實(shí)值”的指針。而“真實(shí)值”則是一個可以被外部存儲的鍵值對,其中的 key 可以使用 O(1) 時(shí)間內(nèi)獲取到,value 則需要在 redis 中進(jìn)行查找比較。
Redis 將每個跳表節(jié)點(diǎn)和“真實(shí)值”之間的關(guān)系建模為一種雙向鏈表:每一個節(jié)點(diǎn)都指向一個“真實(shí)值”,而“真實(shí)值”又包含一個指向下一個節(jié)點(diǎn)的指針。這種鏈表構(gòu)成了一種按順序排列的數(shù)據(jù)結(jié)構(gòu),能夠滿足查找,范圍查找,添加,刪除等操作的需求。
下面是 Redis 跳表的部分源碼,其中實(shí)現(xiàn)了 Redis 跳表的核心函數(shù):
// 初始化跳表
skiplist *skiplistCreate(void) {
struct skiplist *SL;
int j;
if ((sl = zmalloc(sizeof(*sl))) == NULL)
return NULL;
sl->level = 1;
sl->length = 0;
sl->header = skiplistNodeCreate(SKIPLIST_MAXLEVEL,0,NULL);
for (j = 0; j
sl->header->level[j].forward = NULL;
sl->header->level[j].span = 0;
}
sl->header->backward = NULL;
sl->tl = NULL;
return sl;
}
// 給定一個特定值,插入新節(jié)點(diǎn)
int skiplistInsert(skiplist *sl, double score, sds ele) {
struct skiplistNode *update[SKIPLIST_MAXLEVEL], *x;
unsigned int level;
int i;
x = sl->header;
for (i = sl->level - 1; i >= 0; i--) {
while (x->level[i].forward &&
(x->level[i].forward->score
x = x->level[i].forward;
update[i] = x;
}
/* we assume the key is not already inside, since we allow duplicated
* scores, and the re-insertion of score and redis object should never
* happen since the caller of skiplistInsert() should test in the
* hash table first. */
level = skiplistRandomLevel();
if (level > sl->level) {
for (i = sl->level; i
update[i] = sl->header;
update[i]->level[i].span = sl->length;
}
sl->level = level;
}
x = skiplistNodeCreate(level,score,ele);
for (i = 0; i
x->level[i].forward = update[i]->level[i].forward;
update[i]->level[i].forward = x;
/* update span covered by update[i] as x is inserted here */
x->level[i].span = update[i]->level[i].span - (sl->length - update[i]->level[i].span);
update[i]->level[i].span = (sl->length - update[i]->level[i].span) + 1;
}
x->backward = (update[0] == sl->header) ? NULL : update[0];
if (x->level[0].forward)
x->level[0].forward->backward = x;
else
sl->tl = x;
sl->length++;
return 1;
}
Redis 中的跳表支持 O(logn) 復(fù)雜度的查找,普通插入操作的復(fù)雜度也只需要 O(logn) ,在一定程度上可以幫助 Redis 提升性能。
成都網(wǎng)站推廣找創(chuàng)新互聯(lián),老牌網(wǎng)站營銷公司
成都網(wǎng)站建設(shè)公司創(chuàng)新互聯(lián)(www.cdcxhl.com)專注高端網(wǎng)站建設(shè),網(wǎng)頁設(shè)計(jì)制作,網(wǎng)站維護(hù),網(wǎng)絡(luò)營銷,SEO優(yōu)化推廣,快速提升企業(yè)網(wǎng)站排名等一站式服務(wù)。IDC基礎(chǔ)服務(wù):云服務(wù)器、虛擬主機(jī)、網(wǎng)站系統(tǒng)開發(fā)經(jīng)驗(yàn)、服務(wù)器租用、服務(wù)器托管提供四川、成都、綿陽、雅安、重慶、貴州、昆明、鄭州、湖北十堰機(jī)房互聯(lián)網(wǎng)數(shù)據(jù)中心業(yè)務(wù)。
文章題目:Redis中跳表實(shí)現(xiàn)了性能優(yōu)化(redis跳表優(yōu)化)
分享路徑:http://m.fisionsoft.com.cn/article/cdohhhg.html


咨詢
建站咨詢
