jinfeng_wang

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

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

          轉(zhuǎn)載請注明出處哈:http://carlosfu.iteye.com/blog/2269678


           

          一、緩存的成本和收益是什么:

           

            既然要討論是否真的需要緩存這個問題,就要知道緩存帶來的成本與收益(好處、壞處)是什么?

           收益成本
          緩存 + 后端存儲(資源)

          1. 加速讀寫

          2. 降低后端負(fù)載

          1. 數(shù)據(jù)不一致性

          2. 代碼維護(hù)成本

          3. 架構(gòu)復(fù)雜度

           

            上面的表格應(yīng)該清楚的表達(dá)了使用緩存后的收益和成本分別是什么。下面將進(jìn)行詳細(xì)的解析

           

          二、緩存成本與收益詳解:

           

            1. 收益是很明顯的,通常來說一個設(shè)計(jì)還不錯的緩存系統(tǒng),能夠幫助你的業(yè)務(wù)實(shí)現(xiàn)加速讀寫,同時幫助降低了后端負(fù)載。

             (1) 加速讀寫:通常來說加速是明顯的,因?yàn)榫彺嫱ǔ6际侨珒?nèi)存的系統(tǒng),而后端(可能是mysql、甚至是別人的HTTP, RPC接口)都有速度慢和抗壓能力差的特性,通過緩存的使用可以有效的提高用戶的訪問速度同時優(yōu)化了用戶的體驗(yàn)。

             (2) 降低后端負(fù)載:通過緩存的添加,如果程序沒有什么問題,在命中率還可以的情況下,可以幫助后端減少訪問量和復(fù)雜計(jì)算(join、或者無法在優(yōu)化的sql等),在很大程度降低了后端的負(fù)載。

            2. 成本:

             (1) 數(shù)據(jù)不一致性:無論你的設(shè)計(jì)做的多么好,緩存數(shù)據(jù)與權(quán)威數(shù)據(jù)源(可以理解成真實(shí)或者后端數(shù)據(jù)源)一定存在著一定時間窗口的數(shù)據(jù)不一致性,這個時間窗口的大小可大可小,具體多大還要看一下你的業(yè)務(wù)允許多大時間窗口的不一致性。

             (2) 代碼維護(hù)成本:加入緩存后,代碼就會在原數(shù)據(jù)源基礎(chǔ)上加入緩存的相關(guān)代碼,例如原來只是一些sql, 現(xiàn)在要加入k-v緩存,必然增加了代碼的維護(hù)成本。

             (3) 架構(gòu)復(fù)雜度:加入緩存后,例如加入了redis-cluster,一般來說緩存不會像Mysql有專門的DBA,很有可能沒有專職的管理人員,所以也增加了架構(gòu)的復(fù)雜度和維護(hù)成本。

           

          三、如何選擇?

           

            如果當(dāng)前系統(tǒng)的訪問速度和訪問量能夠滿足現(xiàn)有的要求,就不必增加緩存,其實(shí)像mysql并沒有那么差,一臺運(yùn)行良好的Mysql,扛個QPS=1000沒什么問題。

            如果要加入選擇了緩存,一定要能給出足夠的理由,不是為了簡單的show技術(shù)和想當(dāng)然,最好的方法就是用數(shù)據(jù)說話:加速比有多少、后端負(fù)載降低了多少。

           

          四、什么樣的場景需要緩存?

           

              在公司里,據(jù)我觀察,無論怎么更新架構(gòu),使用各種新技術(shù),但是80%的項(xiàng)目還是離不開SQL的,下面我們以SQL作為后端數(shù)據(jù)源、以Redis作為緩存層,說一下哪些場景是需要緩存的。

          1、復(fù)雜開銷大的計(jì)算、降低后端負(fù)載

              以Mysql為例子,一些復(fù)雜的操作或者計(jì)算(例如大量聯(lián)表操作、一些分組計(jì)算),如果不加

          緩存,大量流量將在這些復(fù)雜計(jì)算的執(zhí)行。

           

          2. 加速請求響應(yīng)

              即使單條后端數(shù)據(jù)足夠快(例如select * from table where id=?),那么依然可以利用redis/memcache將這些操作進(jìn)行merge做優(yōu)化(例如:cache(select * from table where id in(id1,id10....idK))),從而優(yōu)化整個IO鏈的相應(yīng)時間。

           

           

           

          附圖一張:

           

          posted on 2016-12-20 17:12 jinfeng_wang 閱讀(155) 評論(0)  編輯  收藏 所屬分類: 2016-REDIS
          主站蜘蛛池模板: 永平县| 莒南县| 渭南市| 华宁县| 兴化市| 望江县| 乐昌市| 砀山县| 崇仁县| 苏尼特左旗| 定边县| 十堰市| 巴林左旗| 清水河县| 丘北县| 平江县| 扎鲁特旗| 龙胜| 梅州市| 阿克陶县| 茂名市| 乌海市| 邵阳市| 大名县| 扎兰屯市| 蓬安县| 白朗县| 体育| 明水县| 汝南县| 钦州市| 兴仁县| 绥江县| 瑞丽市| 罗江县| 鄱阳县| 辽源市| 临泽县| 常德市| 汾阳市| 昭苏县|