緩存粒度控制
下圖是很多項(xiàng)目關(guān)于緩存比價(jià)常用的選型乡摹,緩存層選用Redis,存儲(chǔ)層選用MySQL采转。
例如現(xiàn)在需要將MySQL的用戶(hù)信息使用Redis緩存聪廉,可以執(zhí)行如下操作:
從MySQL獲取用戶(hù)信息:
select * from user where id={id}
將用戶(hù)信息緩存到Redis中:
set user:{id} 'select * from user where id={id}
假設(shè)用戶(hù)表有100個(gè)列,需要緩存到什么維度呢故慈?
-
緩存全部列:
set user:{id} 'select * from user where id={id}
-
緩存部分重要列:
set user:{id} 'select {importantColumn1}, {important Column2} ... {importantColumnN} from user where id={id}
上述這個(gè)問(wèn)題就是緩存粒度問(wèn)題板熊,究竟是緩存全部屬性還是只緩存部分重要屬性呢?下面將從通用性察绷、空間占用干签、代碼維護(hù)三個(gè)角度進(jìn)行說(shuō)明。
通用性克婶。緩存全部數(shù)據(jù)比部分?jǐn)?shù)據(jù)更加通用筒严,但從實(shí)際經(jīng)驗(yàn)看,很長(zhǎng)時(shí)間內(nèi)應(yīng)用只需要幾個(gè)重要的屬性情萤。
空間占用鸭蛙。緩存全部數(shù)據(jù)要比部分?jǐn)?shù)據(jù)占用更多的空間,可能存在以下問(wèn)題:
全部是數(shù)據(jù)會(huì)造成內(nèi)存的浪費(fèi)筋岛。
全部數(shù)據(jù)可能每次傳輸產(chǎn)生的網(wǎng)絡(luò)流量會(huì)比較大娶视,耗時(shí)相對(duì)較大,在極端情況下會(huì)阻塞網(wǎng)絡(luò)。
全部數(shù)據(jù)的序列化和反序列化的CPU開(kāi)銷(xiāo)更大肪获。
代碼維護(hù)寝凌。全部數(shù)據(jù)的優(yōu)勢(shì)更加明顯,而部分?jǐn)?shù)據(jù)一旦要加新字段需要修改業(yè)務(wù)代碼孝赫,而且修改后通常還需要刷新緩存數(shù)據(jù)较木。
下表給出緩存全部數(shù)據(jù)和部分?jǐn)?shù)據(jù)在通用性、空間占用青柄、diamante維護(hù)上的對(duì)比伐债,開(kāi)發(fā)人員酌情選擇。
數(shù)據(jù)類(lèi)型 | 通用性 | 空間占用(內(nèi)存空間+網(wǎng)絡(luò)寬帶) | 代碼維護(hù) |
---|---|---|---|
全部數(shù)據(jù) | 高 | 大 | 簡(jiǎn)單 |
部分?jǐn)?shù)據(jù) | 低 | 小 | 較為復(fù)雜 |
緩存粒度問(wèn)題是一個(gè)容易被忽視的問(wèn)題致开,如果使用不當(dāng)峰锁,可能會(huì)造成很多無(wú)用空間的浪費(fèi),網(wǎng)絡(luò)帶寬的浪費(fèi)双戳,代碼通用性較差等情況虹蒋,需要綜合數(shù)據(jù)通用性、空間占用比飒货、代碼維護(hù)性三點(diǎn)進(jìn)行取舍魄衅。