Redis 是目前 NoSQL 領(lǐng)域的當(dāng)紅炸子雞,它象一把瑞士軍刀,小巧、鋒利、實(shí)用,特別適合解決一些使用傳統(tǒng)關(guān)系數(shù)據(jù)庫(kù)難以解決的問(wèn)題。但是 Redis 不是銀彈,有很多適合它解決的問(wèn)題,但是也有很多并不適合它解決的問(wèn)題。另外,Redis 作為內(nèi)存數(shù)據(jù)庫(kù),如果用在不適合的場(chǎng)合,對(duì)內(nèi)存的消耗是很可觀的,甚至?xí)屜到y(tǒng)難以承受。
我們可以對(duì)系統(tǒng)存儲(chǔ)使用的數(shù)據(jù)以?xún)煞N角度分類(lèi),一種是按數(shù)據(jù)的大小劃分,分成大數(shù)據(jù)和小數(shù)據(jù),另一種是按數(shù)據(jù)的冷熱程度劃分,分成冷數(shù)據(jù)和熱數(shù)據(jù),熱數(shù)據(jù)是指讀或?qū)懕容^頻繁的數(shù)據(jù),反之則是冷數(shù)據(jù)。
可以舉一些具體的例子來(lái)說(shuō)明數(shù)據(jù)的大小和冷熱屬性。比如網(wǎng)站總的注冊(cè)用戶(hù)數(shù),這明顯是一個(gè)小而熱的數(shù)據(jù),小是因?yàn)檫@個(gè)數(shù)據(jù)只有一個(gè)值,熱是因?yàn)樽?cè)用戶(hù)數(shù)隨時(shí)間變化很頻繁。再比如,用戶(hù)最新訪(fǎng)問(wèn)時(shí)間數(shù)據(jù),這是一個(gè)量比較大,冷熱不均的數(shù)據(jù),大是數(shù)據(jù)的粒度是用戶(hù)級(jí)別,每一個(gè)用戶(hù)都有數(shù)據(jù),如果有一千萬(wàn)用戶(hù),就意味著有一千萬(wàn)的數(shù)據(jù),冷熱不均是因?yàn)榛钴S用戶(hù)的最新訪(fǎng)問(wèn)時(shí)間變化很頻繁,但是可能有很大一部非活躍用戶(hù)訪(fǎng)問(wèn)時(shí)間長(zhǎng)時(shí)間不會(huì)發(fā)生變化。
大體而言,Redis 最適合處理的是小而熱,而且是寫(xiě)頻繁,或者讀寫(xiě)都比較頻繁的熱數(shù)據(jù)。對(duì)于大而熱的數(shù)據(jù),如果其它方式很難解決問(wèn)題,也可以考慮使用 Redis 解決,但是一定要非常謹(jǐn)慎,防止數(shù)據(jù)無(wú)限膨脹。原因如下:
首先,對(duì)于冷數(shù)據(jù),無(wú)論大小,都不建議放在 Redis 中。Redis 數(shù)據(jù)要全部放在內(nèi)存中,資源寶貴,把冷數(shù)據(jù)放在其中實(shí)在是一種浪費(fèi),冷數(shù)據(jù)放在普通的存儲(chǔ)比如關(guān)系數(shù)據(jù)庫(kù)中就好了。
其次,對(duì)于熱數(shù)據(jù),尤其是寫(xiě)頻繁的熱數(shù)據(jù),如果量比較小,是最適合放到 Redis 中的。比如上面提到的網(wǎng)站總的注冊(cè)用戶(hù)數(shù),就是典型的 Redis 用做計(jì)數(shù)器的例子。再比如論壇最新發(fā)表列表,最新報(bào)名列表,可以控制數(shù)量在幾百到一千的規(guī)模,也是典型的 redis 做最新列表的使用方式。
另外,對(duì)于量比較大的熱數(shù)據(jù)(或者冷熱不均數(shù)據(jù)),使用 Redis 時(shí)一定要比較謹(jǐn)慎。這種類(lèi)型數(shù)據(jù)很容易引起數(shù)據(jù)膨脹,導(dǎo)致 Redis 消耗內(nèi)存巨大,讓系統(tǒng)難以承受。薄荷的一個(gè)慘痛教訓(xùn)是把用戶(hù)關(guān)注(以及被關(guān)注)數(shù)據(jù)放在 Redis 中,這是一種數(shù)據(jù)量極大,冷熱很不均衡的數(shù)據(jù),在幾百萬(wàn)的用戶(hù)級(jí)別就占用了近 10 GB左右內(nèi)存,讓 Redis 變得難以應(yīng)付。應(yīng)對(duì)這種類(lèi)型的數(shù)據(jù),可以用普通存儲(chǔ) + 緩存的方式。
如果用對(duì)了地方,比如在小而熱的數(shù)據(jù)情形,Redis 表現(xiàn)很棒,如果用錯(cuò)了地方,Redis 也會(huì)帶來(lái)昂貴的代價(jià),所以使用時(shí)務(wù)必謹(jǐn)慎。
更多信息請(qǐng)查看IT技術(shù)專(zhuān)欄