一、特殊編碼:
自從Redis 2.2之后,很多數(shù)據(jù)類型都可以通過特殊編碼的方式來進(jìn)行存儲空間的優(yōu)化。其中,Hash、List和由Integer組成的Sets都可以通過該方式來優(yōu)化存儲結(jié)構(gòu),以便占用更少的空間,在有些情況下,可以省去9/10的空間。
這些特殊編碼對于Redis的使用而言是完全透明的,事實(shí)上,它只是CPU和內(nèi)存之間的一個(gè)交易而言。如果內(nèi)存使用率方面高一些,那么在操作數(shù)據(jù)時(shí)消耗的CPU自然要多一些,反之亦然。在Redis中提供了一組配置參數(shù)用于設(shè)置與特殊編碼相關(guān)的各種閾值,如:
從Redis 2.2開始,Redis提供了GETRANGE/SETRANGE/GETBIT/SETBIT四個(gè)用于字符串類型Key/Value的命令。通過這些命令,我們便可以像操作數(shù)組那樣來訪問String類型的值數(shù)據(jù)了。比如唯一標(biāo)識用戶身份的ID,可能僅僅是String值的其中一段子字符串。這樣就可以通過GETRANGE/SETRANGE命令來方便的提取。再有就是可以使用BITMAP來表示用戶的性別信息,如1表示male,0表示female。用這種方式來表示100,000,000個(gè)用戶的性別信息時(shí),也僅僅占用12MB的存儲空間,與此同時(shí),在通過SETBIT/GETBIT命令進(jìn)行數(shù)據(jù)遍歷也是非常高效的。
三、盡可能使用Hash:
由于小的Hash類型數(shù)據(jù)占用的空間相對較少,因此我們在實(shí)際應(yīng)用時(shí)應(yīng)該盡可能的考慮使用Hash類型,比如用戶的注冊信息,這其中包括姓名、性別、email、年齡和口令等字段。我們當(dāng)然可以將這些信息以Key的形式進(jìn)行存儲,而用戶填寫的信息則以String Value的形式存儲。然而Redis則更為推薦以Hash的形式存儲,以上信息則以Field/Value的形式表示。
現(xiàn)在我們就通過學(xué)習(xí)Redis的存儲機(jī)制來進(jìn)一步證明這一說法。在該篇博客的開始處已經(jīng)提到了特殊編碼機(jī)制,其中有兩個(gè)和Hash類型相關(guān)的配置參數(shù):hash-max-zipmap-entries和hash-max-zipmap-value。至于它們的作用范圍前面已經(jīng)給出,這里就不再過多的贅述了?,F(xiàn)在我們先假設(shè)存儲在Hash Value中的字段數(shù)量小于hash-max-zipmap-entries,而每個(gè)元素的長度又同時(shí)小于hash-max-zipmap-value。這樣每當(dāng)有新的Hash類型的Key/Value存儲時(shí),Redis都會為Hash Value創(chuàng)建定長的空間,最大可預(yù)分配的字節(jié)數(shù)為:
total_bytes = hash-max-zipmap-entries * hash-max-zipmap-value
這樣一來,Hash中所有字段的位置已經(jīng)預(yù)留,并且可以像訪問數(shù)組那樣隨機(jī)的訪問Field/Value,他們之間的步長間隔為hash-max-zipmap-value。只有當(dāng)Hash Value中的字段數(shù)量或某一新元素的長度分別超過以上兩個(gè)參數(shù)值時(shí),Redis才會考慮將他們以Hash Table的方式進(jìn)行重新存儲,否則將始終保持這種高效的存儲和訪問方式。不僅如此,由于每個(gè)Key都要存儲一些關(guān)聯(lián)的系統(tǒng)信息,如過期時(shí)間、LRU等,因此和String類型的Key/Value相比,Hash類型極大的減少了Key的數(shù)量(大部分的Key都以Hash字段的形式表示并存儲了),從而進(jìn)一步優(yōu)化了存儲空間的使用效率。
標(biāo)簽:常德 昆明 石嘴山 保定 招商 沈陽 鶴崗 葫蘆島
巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《Redis教程(十四):內(nèi)存優(yōu)化介紹》,本文關(guān)鍵詞 Redis,教程,十四,內(nèi)存,優(yōu)化,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。