jinfeng_wang

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

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

          轉載請注明出處哈:http://carlosfu.iteye.com/blog/2269678


             

           一、什么是緩存粒度

           

              下面這個圖是很多項目關于緩存使用最常用的一個抽象,那么我們假設storage層為mysql, cache層為redis。

           

             

           

           

              假如我現在需要對視頻的信息做一個緩存,也就是需要對select * from video where id=?的每個id在redis里做一份緩存,這樣cache層就可以幫助我抗住很多的訪問量(注:這里不討論一致性和架構等等問題,只討論緩存的粒度問題)。

              我們假設視頻表有100個屬性(這個真有,有些人可能難以想象),那么問題來了,需要緩存什么維度呢,也就是有兩種選擇吧:

          Java代碼  收藏代碼
          1. (1)cache(id)=select * from video where id=#id  
          2. (2)cache(id)=select importantColumn1, importantColumn2 .. importantColumnN from video where id=#id  

           

              其實這個問題就是緩存粒度問題,我們在緩存設計應該佮預估和考慮呢?下面我們將從通用性、空間、代碼維護三個角度進行說明。

           

          二、全部數據和部分數據比較

           

          1. 兩者的特點是顯而易見的:

          數據類型通用性空間占用(內存空間 + 網絡碼率)代碼維護
          全部數據

          簡單 
          部分數據

           

           較為復雜

           

           

          2. 通用性:

              如果單從通用性上看,全部數據是最優秀的,但是有個問題就是是否有必要緩存全部數據,認為以后會有這樣的需求,但是從經驗看除了非常重要的信息,那些不重要的字段基本不會在需求里出現,也就是說這種通用性 通常都是想象出來的。太多人覺得通用性是最重要的。vid拿一些基本信息,會想專輯明星。。要不要用通用性高的,于是加了全局的,通用性很重要,但是要想清楚。

           

          3. 空間占用:

              很顯然,緩存全部數據,會占用大量的內存,有人會說,不就費一點內存嗎,能有多少錢?而且已經有人習慣了把緩存當做下水道來使用,什么都框框的往里面放,但是我這里要說內存并不是免費的,可以說是很珍貴的資源。instagram21->4G的例子就說明了這個道理,好的程序員可以幫助公司節約大量的資源。

              而且單個cache(id)也帶來兩個問題:序列化的開銷和網絡流量的開銷(QPS,百倍),都是無容忽視的。

           

          4. 代碼維護:

              代碼維護性,全部數據的優勢更加明顯,而部分數據一旦要加新字段就會修改代碼,而且還需要對原來的數據進行刷新。

           

           

          三、總結:

           

           緩存粒度問題是一個容易被忽視的問題,如果使用不當,可能會造成很多無用空間的浪費,可能會造成網絡帶寬的浪費,可能會造成代碼通用性較差等情況,必須學會綜合數據通用性、空間占用比、代碼維護性 三點評估取舍因素權衡使用。

           


          posted on 2016-12-20 17:13 jinfeng_wang 閱讀(195) 評論(0)  編輯  收藏 所屬分類: 2016-REDIS
          主站蜘蛛池模板: 八宿县| 墨竹工卡县| 丁青县| 饶河县| 精河县| 扎赉特旗| 岱山县| 茌平县| 迭部县| 拜泉县| 深州市| 方城县| 秭归县| 固阳县| 大姚县| 都昌县| 绍兴市| 甘孜县| 溧水县| 余庆县| 隆尧县| 巩义市| 乌鲁木齐市| 镇远县| 布尔津县| 通州市| 蕉岭县| 温泉县| 富锦市| 漳平市| 武穴市| 扶绥县| 博湖县| 南部县| 府谷县| 城口县| 鹤壁市| 泰安市| 涟水县| 红桥区| 若尔盖县|