新聞中心
Redis中多線程處理過期策略

十余年的昔陽網(wǎng)站建設(shè)經(jīng)驗(yàn),針對設(shè)計(jì)、前端、開發(fā)、售后、文案、推廣等六對一服務(wù),響應(yīng)快,48小時及時工作處理。全網(wǎng)整合營銷推廣的優(yōu)勢是能夠根據(jù)用戶設(shè)備顯示端的尺寸不同,自動調(diào)整昔陽建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計(jì),從而大程度地提升瀏覽體驗(yàn)。創(chuàng)新互聯(lián)公司從事“昔陽網(wǎng)站設(shè)計(jì)”,“昔陽網(wǎng)站推廣”以來,每個客戶項(xiàng)目都認(rèn)真落實(shí)執(zhí)行。
Redis是一款高性能的NoSQL數(shù)據(jù)庫,在緩存方面應(yīng)用非常廣泛。Redis通過使用過期時間來控制緩存的數(shù)據(jù)時效性,但是隨著Redis存儲的數(shù)據(jù)規(guī)模越來越大,過期鍵的數(shù)量也逐漸增加,給Redis帶來了很大的負(fù)擔(dān)。為了解決這個問題,Redis引入了多線程機(jī)制處理過期策略。
一、Redis過期策略
Redis中使用的鍵值對都可以設(shè)置一個過期時間,當(dāng)該鍵值對的過期時間到達(dá)時,Redis會自動將該鍵值對刪除。Redis中有兩種過期策略:定期刪除和惰性刪除。
1. 定期刪除:Redis默認(rèn)情況下每隔100ms就會隨機(jī)測試一些設(shè)置了過期時間的鍵值對,取出其中過期的鍵值對進(jìn)行刪除。這種策略的缺點(diǎn)是會浪費(fèi)一定的CPU資源進(jìn)行檢查,同時對于存活時間較短的鍵值對可能會錯過過期時間。
2. 惰性刪除:Redis的惰性刪除策略遵循“用時刪除”的原則,只有在鍵值對被訪問時才會檢查當(dāng)前鍵值對是否過期,如果發(fā)現(xiàn)過期就刪除。這種策略不會浪費(fèi)CPU資源,但是會占用更多的內(nèi)存,且對于長時間未訪問的鍵值對無法進(jìn)行及時刪除。
二、Redis 4.0多線程過期處理
Redis 4.0版本中引入了多線程機(jī)制處理過期策略,采用的是定期刪除和惰性刪除方式的組合。通過設(shè)置一個新的配置項(xiàng)“activerehashing”,啟用新的掃描器線程,該線程可以平滑的升級eviction策略。
1. 多線程過期處理的優(yōu)勢:
(1)大大減少了對CPU的占用,提高了系統(tǒng)的性能。
(2)減少了在主線程中執(zhí)行刪除操作所需的時間,加快了執(zhí)行效率。
(3)增加了系統(tǒng)容錯性,避免了單點(diǎn)故障的情況下緩存不可用的風(fēng)險(xiǎn)。
(4)解決了單線程模型下過期鍵集中的問題,提高了內(nèi)存利用率。
2. 開啟多線程過期處理:
在redis的配置文件中將“activerehashing”參數(shù)設(shè)置為“yes”,并將“hz”參數(shù)增加到100(默認(rèn)為10)來增加掃描次數(shù)。
# Redis configuration file example
activerehashing yes
hz 100
三、定制化過期處理
Redis 4.0多線程過期處理有時可能不能滿足特定的業(yè)務(wù)需求,可以通過輕量級標(biāo)準(zhǔn)庫“uv”提供的特性,實(shí)現(xiàn)自定義的過期鍵功能。
1. 自定義過期鍵
以設(shè)置SLOWLY_EXPIRE的鍵值對作為例子,利用管道(Pipeline)進(jìn)行批量查詢和批量刪除的功能,定制化的過期處理如下:
int expire_slowly(redisContext* c, int id, int64_t timeout) {
redisReply* reply = NULL;
const char * argv[] = {“SET”, “SLOWLY_EXPIRE”, “1”, “PX”, timeout, “NX”, NULL};
reply = redisCommandArgv(c, 6, argv, NULL);
if (reply == NULL) {
redisFree(c);
return -1;
}
freeReplyObject(reply);
return 0;
}
int delete_slowly(redisContext *c, int id) {
redisReply *reply;
const char* argv[] = { “DEL”, “SLOWLY_EXPIRE”, NULL };
reply = redisCommandArgv(c, 2, argv, NULL);
if (reply == NULL) {
redisFree(c);
return -1;
}
freeReplyObject(reply);
return 0;
}
2. 主動調(diào)用過期鍵
設(shè)置完自定義過期鍵之后,我們可以通過類似“SELECT * FROM TABLE WHERE EVENT_TIME
通過定制化過期處理,我們可以更好地根據(jù)業(yè)務(wù)需求,充分發(fā)揮Redis的性能和可用性。
成都網(wǎng)站建設(shè)選創(chuàng)新互聯(lián)(?:028-86922220),專業(yè)從事成都網(wǎng)站制作設(shè)計(jì),高端小程序APP定制開發(fā),成都網(wǎng)絡(luò)營銷推廣等一站式服務(wù)。
當(dāng)前題目:Redis中多線程處理過期策略(redis過期多線程)
URL鏈接:http://www.dlmjj.cn/article/dpigess.html


咨詢
建站咨詢
