新聞中心
功能重塑:Redis中RESIZE功能的好處

我們提供的服務(wù)有:成都網(wǎng)站建設(shè)、成都網(wǎng)站制作、微信公眾號(hào)開(kāi)發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認(rèn)證、云夢(mèng)ssl等。為上千家企事業(yè)單位解決了網(wǎng)站和推廣的問(wèn)題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的云夢(mèng)網(wǎng)站制作公司
Redis是一款高性能的內(nèi)存數(shù)據(jù)庫(kù),其內(nèi)置了多種數(shù)據(jù)結(jié)構(gòu),支持豐富的操作功能,如緩存、消息隊(duì)列、集合、哈希表等等。然而,即使是優(yōu)秀的數(shù)據(jù)庫(kù)也難免存在功能不完善的地方。Resize功能就是Redis中需要完善的一項(xiàng)功能。本文將重點(diǎn)介紹Redis中Resize功能的好處以及如何實(shí)現(xiàn)。
Redis中的Resize功能是指縮小內(nèi)存管理區(qū)域的功能。在Redis中,每一種數(shù)據(jù)結(jié)構(gòu)都有對(duì)應(yīng)的內(nèi)存管理區(qū)域,每當(dāng)Redis中的某個(gè)數(shù)據(jù)結(jié)構(gòu)被刪除或者其占用的內(nèi)存變得過(guò)小時(shí),這個(gè)內(nèi)存管理區(qū)域并不會(huì)減小,從而導(dǎo)致內(nèi)存空間浪費(fèi)。而Resize功能的目的就是在Redis內(nèi)存管理區(qū)域過(guò)大時(shí),可以自動(dòng)縮小內(nèi)存管理區(qū)域的大小。這樣就能夠更加高效地利用Redis的內(nèi)存資源,降低內(nèi)存的浪費(fèi)。
實(shí)現(xiàn)Redis中的Resize功能需要提前了解Redis中的內(nèi)存管理機(jī)制。Redis中使用RedisObject作為對(duì)象的抽象,它根據(jù)實(shí)際情況分為5中類型:字符串類型、哈希類型、列表類型、集合類型和有序集合類型,每一種類型的RedisObject都有相應(yīng)的內(nèi)存管理機(jī)制。在Redis中,每個(gè)RedisObject都有一個(gè)對(duì)應(yīng)的sds或struct實(shí)例,用于存儲(chǔ)對(duì)應(yīng)的數(shù)據(jù)。但是,當(dāng)RedisObject被刪除或者數(shù)據(jù)的長(zhǎng)度變得很短時(shí),內(nèi)部的sds或struct實(shí)例并不會(huì)被釋放,這就造成了內(nèi)存的浪費(fèi)。而Resize功能的實(shí)現(xiàn)就是通過(guò)釋放這些不必要的內(nèi)存來(lái)達(dá)到優(yōu)化內(nèi)存使用的目的。
具體實(shí)現(xiàn)Resize的方式有幾種,下面以哈希類型為例進(jìn)行說(shuō)明。哈希類型中每個(gè)鍵值對(duì)都對(duì)應(yīng)一個(gè)RedisObject對(duì)象,在刪除哈希類型中某個(gè)鍵值對(duì)時(shí),可以通過(guò)判斷已經(jīng)刪掉的對(duì)象的大小和已用的內(nèi)存量來(lái)判斷是否觸發(fā)Resize功能。在RedisObject內(nèi)部,可以引入一個(gè)函數(shù)用于自動(dòng)釋放無(wú)用的內(nèi)存空間,一般會(huì)將這個(gè)函數(shù)放在_free系列函數(shù)中。當(dāng)哈希類型中有鍵值對(duì)被刪除時(shí),這個(gè)_free函數(shù)就會(huì)被觸發(fā),從而達(dá)到釋放無(wú)用內(nèi)存的目的。
Resize功能的實(shí)現(xiàn)不僅能夠降低Redis內(nèi)存的浪費(fèi),同時(shí)也能夠提高Redis的性能。由于釋放內(nèi)存時(shí)需要遍歷哈希表或者其他數(shù)據(jù)結(jié)構(gòu),所以在實(shí)際運(yùn)行時(shí)會(huì)稍微增加一些CPU的負(fù)載。但是,由于Redis采用的是單線程模型,所以沒(méi)有鎖的問(wèn)題,而且Redis內(nèi)部的哈希表遍歷方式確保了數(shù)據(jù)結(jié)構(gòu)中對(duì)象的順序,從而使得實(shí)現(xiàn)Resize功能的代價(jià)很小,幾乎可以忽略不計(jì)。
Resize功能的實(shí)現(xiàn)能夠更加高效地利用Redis的內(nèi)存資源,降低內(nèi)存的浪費(fèi)。同時(shí)也能夠提高Redis的性能,從而更好地支持大規(guī)模的數(shù)據(jù)存儲(chǔ)和處理。 在實(shí)際應(yīng)用中,我們需要根據(jù)實(shí)際情況評(píng)估內(nèi)存的使用情況,合理設(shè)置Resize功能的閾值,以達(dá)到最佳的性能表現(xiàn)。
參考代碼:
以下是Redis中哈希類型刪除鍵值對(duì)時(shí),判斷是否需要釋放內(nèi)存的代碼片段:
hdelCommand(redisClient *c){
……
if (deleted) {
if (HT_DELETED_NODE_VAL(rules,NULL)) { // 判斷是否需要 Resize
dictEnableResize(h->ht); // 啟動(dòng)Resize
}
notifyKeyspaceEvent(NOTIFY_HASH,”hdel”,c->argv[1],c->db->id);
server.dirty++;
}
……
}
以下是Redis中哈希表使用Resize的代碼片段:
/* Perform a resize if needed (dict_can_resize is true) */
void dictResize(dict *d)
{
int64_t minimal;
/* Don’t start a resize if the dictionary is already rehashing, if
* the ratio between keys and buckets is less than specified,
* or if we are in the middle of a bgrewrite save. */
if (dictIsRehashing(d) || dict_force_resize_ratio == 0 ||
d->ht[0].used
minimal = d->ht[0].used*100/dict_force_resize_ratio;
if (minimal
_dictResize(d,minimal);
}
注:代碼僅供參考。
成都創(chuàng)新互聯(lián)科技有限公司,是一家專注于互聯(lián)網(wǎng)、IDC服務(wù)、應(yīng)用軟件開(kāi)發(fā)、網(wǎng)站建設(shè)推廣的公司,為客戶提供互聯(lián)網(wǎng)基礎(chǔ)服務(wù)!
創(chuàng)新互聯(lián)(www.cdcxhl.com)提供簡(jiǎn)單好用,價(jià)格厚道的香港/美國(guó)云服務(wù)器和獨(dú)立服務(wù)器。創(chuàng)新互聯(lián)成都老牌IDC服務(wù)商,專注四川成都IDC機(jī)房服務(wù)器托管/機(jī)柜租用。為您精選優(yōu)質(zhì)idc數(shù)據(jù)中心機(jī)房租用、服務(wù)器托管、機(jī)柜租賃、大帶寬租用,可選線路電信、移動(dòng)、聯(lián)通等。
本文題目:功能重塑Redis中Resize功能的好處(redis的resize)
URL標(biāo)題:http://fisionsoft.com.cn/article/dhgocgd.html


咨詢
建站咨詢
