日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
強(qiáng)可用的Redis多線程實(shí)現(xiàn)高效的過期管理(redis過期多線程)

在大規(guī)模分布式系統(tǒng)中,Redis已經(jīng)成為了最流行的緩存和數(shù)據(jù)存儲方案之一。然而,為了保證Redis系統(tǒng)的高可用性,運(yùn)維人員需要采取一系列措施,其中最重要的就是對Redis鍵的過期時(shí)間進(jìn)行管理。

為桐梓等地區(qū)用戶提供了全套網(wǎng)頁設(shè)計(jì)制作服務(wù),及桐梓網(wǎng)站建設(shè)行業(yè)解決方案。主營業(yè)務(wù)為網(wǎng)站建設(shè)、成都網(wǎng)站制作、桐梓網(wǎng)站設(shè)計(jì),以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠的服務(wù)。我們深信只要達(dá)到每一位用戶的要求,就會得到認(rèn)可,從而選擇與我們長期合作。這樣,我們也可以走得更遠(yuǎn)!

傳統(tǒng)的Redis采用單線程方式對鍵的過期時(shí)間進(jìn)行管理,這種方式雖然保證了數(shù)據(jù)一致性,但是在高并發(fā)場景下會造成性能瓶頸。為了解決這個問題,Redis 4.0引入了多線程方式實(shí)現(xiàn)過期管理,大大提升了Redis的性能。

多線程方式實(shí)現(xiàn)高效的過期管理

Redis的多線程方式實(shí)現(xiàn)過期管理的原理是將Redis鍵值對按照過期時(shí)間進(jìn)行排序,將快要過期的數(shù)據(jù)優(yōu)先淘汰。Redis將過期時(shí)間輪(Expire wheel)劃分為多個時(shí)間槽,每個時(shí)間槽對應(yīng)一個過期時(shí)間,Redis在每個時(shí)間槽中維護(hù)一個鏈表結(jié)構(gòu),存儲在這個時(shí)間槽內(nèi)過期的鍵值對。Redis通過多個線程定時(shí)移動時(shí)間槽,將過期時(shí)間較短的鍵值對優(yōu)先淘汰,從而達(dá)到高效的過期管理。

下面是Redis多線程方式實(shí)現(xiàn)過期管理的代碼:

#define REDIS_EXPIRELOOKUPS_PER_LOOP 20
void activeExpireCycle(int type) {
/* 定義時(shí)鐘的處理周期 */
long long start = ustime(), timelimit_exit = 0, timelimit_us = 0;
unsigned int expired = 0;
if (server.masterhost && server.repl_slave_ro == 1) return;

/* 如果Redis是開啟寫保護(hù)的,直接返回 */
if (server.activerehashing) return;
if (type == ACTIVE_EXPIRE_CYCLE_FAST)
timelimit_us = 1000;
else
timelimit_us = server.maxmemory_samples ? 0 : 100000;
/* 如果Redis有設(shè)置最大循環(huán)時(shí)間,則使用它 */
if (server.maxmemory_samples != 0) {
timelimit_exit = start + (1000000/server.hz)*server.maxmemory_samples;
}
/* 停止keys迭代器 */
signalFlushedDb(-1);
while(1) {
long long now;
int j;

/* 如果達(dá)到了我們的定義的過期處理掃描次數(shù),需要退出循環(huán)。 */
if (type == ACTIVE_EXPIRE_CYCLE_FAST)
timelimit_exit = start + 1000;
if (server.maxmemory_samples != 0) {
if (ustime() > timelimit_exit) break;
}
/* 記錄當(dāng)前的時(shí)間戳 */
now = mstime();
/* 減少計(jì)數(shù)器的值 */
if (server.lazyfree_lazy_expire) lazyfreeTryExpire(now);
/* 需要分配候選鍵數(shù)組,該數(shù)組用來記錄到期的鍵 */
if (expired_entries_pool_size
populateExpiredArray();

/* 遍歷所有哈希表,查找到期鍵 */
for (j = 0; j
int expired_this_loop = 0;

/* 獲得當(dāng)前數(shù)據(jù)庫 */
redisDb *db = server.db+j;
/* 因?yàn)閳?zhí)行過期操作時(shí),需要修改鍵而且Redis是事件驅(qū)動的,
如果在過期操作時(shí)有其它操作正在進(jìn)行,可能會產(chǎn)生沖突
所以,該庫必須被標(biāo)記 */
if (dictSize(db->expires)) {
dictEntry *de;
de = dictFind(db->expires,dictGetSomeKeys(db->expires));
if (de) {
long long t = dictGetSignedIntegerVal(de)-now;
/* 如果該鍵已經(jīng)過期,將其淘汰 */
if (t
flushdbAsync(j);
expired+=dictSize(db->expires);
continue;
}
/* 計(jì)算出該時(shí)間槽所屬的槽位 */
int i = (t/1000)
(t/1000) : (REDIS_EXPIRELOOKUPS_PER_LOOP-1);
/* 將該鍵存儲到該時(shí)間槽所屬的鏈表中 */
expired_candidates[i][expired_count[i]] = de;
expired_count[i]++;
}
}
}

/* 遍歷所有的時(shí)隙,逐個處理過期鍵值 */
for (j = 0; j
dictEntry *de;
if (expired_count[j] == 0) continue;
/* 遍歷當(dāng)前時(shí)間槽的所有鍵值對 */
while(expired_count[j]--) {
de = expired_candidates[j][expired_count[j]];
dictDelete(server.db[de->v.val].dict,dictGetKey(de));
dictDelete(server.db[de->v.val].expires,dictGetKey(de));
notifyKeyspaceEvent(REDIS_NOTIFY_EXPIRED,
"expired",dictGetKey(de),
dictGetKeyLength(de));
decrRefCount(dictGetKey(de));
server.dirty++;
if (++expired >= REDIS_EXPIREDLOOKUPS_PER_CRON) break;
}
/* 如果達(dá)到最大過期鍵掃描次數(shù),需要退出循環(huán) */
if (expired >= REDIS_EXPIREDLOOKUPS_PER_CRON) {
goto end;
}
}
}
end:
/* 重置過期鍵候選數(shù)組 */
expired_entries_pool_size = 0;
memset(expired_candidates,0,sizeof(expired_candidates));
memset(expired_count,0,sizeof(expired_count));

/* 重置keys迭代器 */
signalFlushedDb(-1);
}

如上面的代碼所示,Redis在以上循環(huán)中處理過期鍵值對。具體而言,Redis將鍵值對存儲在過期時(shí)間槽所屬的鏈表中,每次清理的是快要過期的鍵,避免因?yàn)椴l(fā)性能瓶頸而使Redis出現(xiàn)性能問題。

結(jié)語

采用多線程方式實(shí)現(xiàn)高效的過期管理方式是實(shí)現(xiàn)Redis高可用性的關(guān)鍵之一。通過優(yōu)化Redis的過期管理方式,我們可以更好地保證Redis的性能和穩(wěn)定性,為用戶帶來更好的使用體驗(yàn)。

香港服務(wù)器選創(chuàng)新互聯(lián),2H2G首月10元開通。
創(chuàng)新互聯(lián)(www.cdcxhl.com)互聯(lián)網(wǎng)服務(wù)提供商,擁有超過10年的服務(wù)器租用、服務(wù)器托管、云服務(wù)器、虛擬主機(jī)、網(wǎng)站系統(tǒng)開發(fā)經(jīng)驗(yàn)。專業(yè)提供云主機(jī)、虛擬主機(jī)、域名注冊、VPS主機(jī)、云服務(wù)器、香港云服務(wù)器、免備案服務(wù)器等。


網(wǎng)站標(biāo)題:強(qiáng)可用的Redis多線程實(shí)現(xiàn)高效的過期管理(redis過期多線程)
轉(zhuǎn)載注明:http://www.dlmjj.cn/article/dpgdhss.html