[转]localCache与集中式cache
http://www.cnblogs.com/redcreen/archive/2011/02/15/1955248.html
使用memcache緩存數(shù)據(jù),減少對數(shù)據(jù)庫的直接訪問,提高網(wǎng)站性能已經(jīng)成了各大網(wǎng)站最基本的技術(shù).如何更好的提高memcache緩存的利用率及命中次數(shù)會在后面的blog中單獨(dú)介紹,本文主要探討為何及如何使用本地緩存(java localcache)提高網(wǎng)站性能.
localcache與memcache性能比較
?先來個本地緩存與memcache緩存的性能比較,有個直觀上的概念
| Cache | 請求方式 | 次數(shù) | 時間 | 平均 |
| Localcache | hashmap中get請求 | 1億 | 1344ms | 0.00001344ms |
| Memcache | 簡單的get請求,不做序列化 | 1萬 | 4437ms | 0.4437ms |
| Db | 單表查詢(有索引) | ? | ? | 1-2ms |
以上測試在開發(fā)機(jī)器.生產(chǎn)環(huán)境采集的數(shù)據(jù)顯示memcache的一次請求大約在0.2ms左右,如果存儲的是java object,那算上發(fā)序列化的時間在0.5ms以上.與測試數(shù)據(jù)在同一個數(shù)量級上.
通過以上數(shù)據(jù)對比,可以得知localcache的效率比memcache高1萬倍以上.這個數(shù)字讓我對使用本地緩存充滿了極大的興趣.
使用localcache會帶來哪些問題
localcache有著極大的性能優(yōu)勢,單機(jī)情況下,適當(dāng)使用localcache會使程序的效率得到很大的提升.但在集群環(huán)境下localcache就存在很多問題了,主要體現(xiàn)在多個jvm之間cache的同步問題.
有很多框架在這上面做了很多工作,比如ehcache?,主要是通過cache復(fù)制(copy或invalidate)來解決,大概的思路是使用消息多播機(jī)制,當(dāng)一個jvm中的數(shù)據(jù)做了更新操作后,首先更新本jvm內(nèi)的localcache,然后廣播消息,其他jvm接收到消息后更新自己的localcache.?但這種機(jī)制可能帶來并發(fā)操作時出現(xiàn)臟數(shù)據(jù)的問題,具體見Potential Issues with Replicated Caching.
其他cache產(chǎn)品也遇到類似的問題,不再一一介紹.?
那有沒有很好的方法來解決localcache的同步問題,從而可以放心的品嘗localcache這塊"甜餅"呢?
這個問題我也很糾結(jié),通過多種方案的組合及補(bǔ)償機(jī)制似乎可以實(shí)現(xiàn)一個完美的方案.但也注定成為了一個復(fù)雜的方案.類似的方案可以有如下幾種:
1.localcache作為一級緩存,通過廣播的方式同步緩存,同時設(shè)置緩存過期時間,以達(dá)到數(shù)據(jù)同步和出現(xiàn)臟數(shù)據(jù)后自動修復(fù)的功能.
2.localcache作為一級緩存,數(shù)據(jù)更新后發(fā)送異步消息(MQ等),其余localcache訂閱異步消息,并根據(jù)消息來同步緩存.
3.localcache作為一級緩存,memcache中存放緩存變更的信息,定時任務(wù)定時獲取memcache的信息,并決定是否更新localcache.
4.localcache作為一級緩存,每次從memcache中獲取數(shù)據(jù)更改的標(biāo)記位,如果標(biāo)記發(fā)生變化,更新localcache
以上的這些實(shí)現(xiàn)方案,都在一定程度上加大了架構(gòu)的復(fù)雜性,當(dāng)localcache中數(shù)據(jù)出現(xiàn)臟數(shù)據(jù)時,排查問題及清理數(shù)據(jù)都會變得復(fù)雜.
他人經(jīng)驗(yàn)之談
1.sohu早期使用廣播的方式(jgroup)同步localcache,結(jié)果經(jīng)常會出現(xiàn)臟數(shù)據(jù)的問題,在后來的架構(gòu)設(shè)計(jì)上干脆摒棄了localcache(即使使用,也不再作數(shù)據(jù)同步),全部使用memcache.
2.taobao在生產(chǎn)環(huán)境也很少使用localcache同步,對于非敏感性數(shù)據(jù),只是通過簡單的過期策略,來保證數(shù)據(jù)的一致性.
總結(jié)
集群環(huán)境下對于敏感性要求不高的數(shù)據(jù)可以使用localcache,只配置簡單的失效機(jī)制來保證數(shù)據(jù)的一致性.
對敏感性高的數(shù)據(jù)直接使用集中式緩存,減低復(fù)雜度.
復(fù)雜方案看似完美的解決了問題,實(shí)際上性能和穩(wěn)定性卻很可能大打折扣.
感謝William?、放翁提出的寶貴建議。
redcreen總結(jié)
以上是生活随笔為你收集整理的[转]localCache与集中式cache的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JVM系列(一)--JVM运行时数据区
- 下一篇: php基础语法知识笔记(一)