轉(zhuǎn)載請(qǐng)注明出處哈:http://carlosfu.iteye.com/blog/2269678
一、什么是緩存粒度
下面這個(gè)圖是很多項(xiàng)目關(guān)于緩存使用最常用的一個(gè)抽象,那么我們假設(shè)storage層為mysql, cache層為redis。
假如我現(xiàn)在需要對(duì)視頻的信息做一個(gè)緩存,也就是需要對(duì)select * from video where id=?的每個(gè)id在redis里做一份緩存,這樣cache層就可以幫助我抗住很多的訪問量(注:這里不討論一致性和架構(gòu)等等問題,只討論緩存的粒度問題)。
我們假設(shè)視頻表有100個(gè)屬性(這個(gè)真有,有些人可能難以想象),那么問題來了,需要緩存什么維度呢,也就是有兩種選擇吧:
- (1)cache(id)=select * from video where id=#id
- (2)cache(id)=select importantColumn1, importantColumn2 .. importantColumnN from video where id=#id
其實(shí)這個(gè)問題就是緩存粒度問題,我們?cè)诰彺嬖O(shè)計(jì)應(yīng)該佮預(yù)估和考慮呢?下面我們將從通用性、空間、代碼維護(hù)三個(gè)角度進(jìn)行說明。
二、全部數(shù)據(jù)和部分?jǐn)?shù)據(jù)比較
1. 兩者的特點(diǎn)是顯而易見的:
數(shù)據(jù)類型 | 通用性 | 空間占用(內(nèi)存空間 + 網(wǎng)絡(luò)碼率) | 代碼維護(hù) |
全部數(shù)據(jù) | 高 | 大 | 簡單 |
部分?jǐn)?shù)據(jù) | 低 | 小
| 較為復(fù)雜 |
2. 通用性:
如果單從通用性上看,全部數(shù)據(jù)是最優(yōu)秀的,但是有個(gè)問題就是是否有必要緩存全部數(shù)據(jù),認(rèn)為以后會(huì)有這樣的需求,但是從經(jīng)驗(yàn)看除了非常重要的信息,那些不重要的字段基本不會(huì)在需求里出現(xiàn),也就是說這種通用性 通常都是想象出來的。太多人覺得通用性是最重要的。vid拿一些基本信息,會(huì)想專輯明星。。要不要用通用性高的,于是加了全局的,通用性很重要,但是要想清楚。
3. 空間占用:
很顯然,緩存全部數(shù)據(jù),會(huì)占用大量的內(nèi)存,有人會(huì)說,不就費(fèi)一點(diǎn)內(nèi)存嗎,能有多少錢?而且已經(jīng)有人習(xí)慣了把緩存當(dāng)做下水道來使用,什么都框框的往里面放,但是我這里要說內(nèi)存并不是免費(fèi)的,可以說是很珍貴的資源。instagram21->4G的例子就說明了這個(gè)道理,好的程序員可以幫助公司節(jié)約大量的資源。
而且單個(gè)cache(id)也帶來兩個(gè)問題:序列化的開銷和網(wǎng)絡(luò)流量的開銷(QPS,百倍),都是無容忽視的。
4. 代碼維護(hù):
代碼維護(hù)性,全部數(shù)據(jù)的優(yōu)勢(shì)更加明顯,而部分?jǐn)?shù)據(jù)一旦要加新字段就會(huì)修改代碼,而且還需要對(duì)原來的數(shù)據(jù)進(jìn)行刷新。
三、總結(jié):
緩存粒度問題是一個(gè)容易被忽視的問題,如果使用不當(dāng),可能會(huì)造成很多無用空間的浪費(fèi),可能會(huì)造成網(wǎng)絡(luò)帶寬的浪費(fèi),可能會(huì)造成代碼通用性較差等情況,必須學(xué)會(huì)綜合數(shù)據(jù)通用性、空間占用比、代碼維護(hù)性 三點(diǎn)評(píng)估取舍因素權(quán)衡使用。