日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

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

新聞中心

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

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

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

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

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

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

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

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

/* 如果Redis是開啟寫保護的,直接返回 */
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)時間,則使用它 */
if (server.maxmemory_samples != 0) {
timelimit_exit = start + (1000000/server.hz)*server.maxmemory_samples;
}
/* 停止keys迭代器 */
signalFlushedDb(-1);
while(1) {
long long now;
int j;

/* 如果達到了我們的定義的過期處理掃描次數(shù),需要退出循環(huán)。 */
if (type == ACTIVE_EXPIRE_CYCLE_FAST)
timelimit_exit = start + 1000;
if (server.maxmemory_samples != 0) {
if (ustime() > timelimit_exit) break;
}
/* 記錄當前的時間戳 */
now = mstime();
/* 減少計數(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;

/* 獲得當前數(shù)據(jù)庫 */
redisDb *db = server.db+j;
/* 因為執(zhí)行過期操作時,需要修改鍵而且Redis是事件驅(qū)動的,
如果在過期操作時有其它操作正在進行,可能會產(chǎn)生沖突
所以,該庫必須被標記 */
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;
}
/* 計算出該時間槽所屬的槽位 */
int i = (t/1000)
(t/1000) : (REDIS_EXPIRELOOKUPS_PER_LOOP-1);
/* 將該鍵存儲到該時間槽所屬的鏈表中 */
expired_candidates[i][expired_count[i]] = de;
expired_count[i]++;
}
}
}

/* 遍歷所有的時隙,逐個處理過期鍵值 */
for (j = 0; j
dictEntry *de;
if (expired_count[j] == 0) continue;
/* 遍歷當前時間槽的所有鍵值對 */
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;
}
/* 如果達到最大過期鍵掃描次數(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將鍵值對存儲在過期時間槽所屬的鏈表中,每次清理的是快要過期的鍵,避免因為并發(fā)性能瓶頸而使Redis出現(xiàn)性能問題。

結(jié)語

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

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


本文題目:強可用的Redis多線程實現(xiàn)高效的過期管理(redis過期多線程)
URL標題:http://m.5511xx.com/article/dpgdhss.html