jinfeng_wang

          G-G-S,D-D-U!

          BlogJava 首頁 新隨筆 聯(lián)系 聚合 管理
            400 Posts :: 0 Stories :: 296 Comments :: 0 Trackbacks

          轉(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è)真有,有些人可能難以想象),那么問題來了,需要緩存什么維度呢,也就是有兩種選擇吧:

          Java代碼  收藏代碼
          1. (1)cache(id)=select * from video where id=#id  
          2. (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)衡使用。

           


          posted on 2016-12-20 17:13 jinfeng_wang 閱讀(196) 評(píng)論(0)  編輯  收藏 所屬分類: 2016-REDIS
          主站蜘蛛池模板: 蒙山县| 长垣县| 甘肃省| 寿阳县| 巴彦县| 当阳市| 莱州市| 宜春市| 汕头市| 波密县| 木里| 固安县| 长丰县| 石阡县| 汕头市| 天等县| 广昌县| 华亭县| 潼关县| 南溪县| 舞钢市| 柳河县| 天津市| 石渠县| 池州市| 两当县| 安陆市| 林西县| 德令哈市| 莱芜市| 聂荣县| 炎陵县| 万山特区| 丹阳市| 九龙县| 香河县| 扬州市| 宕昌县| 卓资县| 大连市| 大田县|