memcached分布式緩存介紹

1.背景介紹

DB訪問速度問題:

? ? ?許多Web 應(yīng)用程序都將數(shù)據(jù)保存到RDBMS中,應(yīng)用服務(wù)器從中讀取數(shù)據(jù)并在瀏覽器中顯示。但隨著數(shù)據(jù)量的增大,訪問的集中,就會出現(xiàn)REBMS的負(fù)擔(dān)加重,數(shù)據(jù)庫響應(yīng)惡化,網(wǎng)站顯示延遲等重大影響。

2.知識剖析

2.1 Memcached

? ? ? ?Memcached是一款開源、高性能、分布式內(nèi)存對象緩存系統(tǒng),可應(yīng)用各種需要緩存的場景,其主要目的是通過降低對數(shù)據(jù)庫的訪問來加速web應(yīng)用程序。它是一個基于內(nèi)存的“鍵值對”存儲,用于存儲數(shù)據(jù)庫調(diào)用、API調(diào)用或頁面引用結(jié)果的直接數(shù)據(jù),如字符串、對象等。

2.2 Memcached分布式

? ? ? ?Memcached雖然稱為“分布式“緩存服務(wù)器,但服務(wù)器端并沒有“分布式”的功能。Memcached的分布式完全是有客戶端實(shí)現(xiàn)的。

? ? 當(dāng)數(shù)據(jù)到達(dá)客戶端,客戶端實(shí)現(xiàn)的算法就會根據(jù)“鍵”來決定保存的memcached服務(wù)器,服務(wù)器選定后,命令他保存數(shù)據(jù)。取的時候也一樣,客戶端根據(jù)“鍵”選擇服務(wù)器,使用保存時候的相同算法就能保證選中和存的時候相同的服務(wù)器。

2.3 memcached緩存特點(diǎn)

1). 協(xié)議簡單

memcached的服務(wù)器客戶端通信并不使用復(fù)雜的MXL等格式,而是使用簡單的基于文本的協(xié)議。

2). 基于libevent的事件處理

libevent是個函數(shù)庫,它將Linux的epoll、BSD類操作系統(tǒng)的kqueue等時間處理功能封裝成統(tǒng)一的接口。memcached使用這個libevent庫,能發(fā)揮高性能;

3). 內(nèi)置內(nèi)存存儲方式

為了提高性能,memcached中保存的數(shù)據(jù)都存儲在memcached內(nèi)置的內(nèi)存存儲空間中。重啟memcached,重啟操作系統(tǒng)會導(dǎo)致全部數(shù)據(jù)消失;

4). memcached不相互通信的分布式

memcached雖然是分布式緩存服務(wù)器,但服務(wù)器端并沒有分布式功能,此功能主要通過客戶端實(shí)現(xiàn);

5) 清理超期數(shù)據(jù)

?默認(rèn)情況下,Memcached是一個LRU緩存,同時,它按事先預(yù)訂的時長清理超期數(shù)據(jù);但事實(shí)上,memcached不會刪除任何已緩存數(shù)據(jù),只是在其過期之后不再為客戶端所見;而且,memcached也不會真正按期限清理緩存,而僅是當(dāng)get命令到達(dá)時檢查其時長,發(fā)現(xiàn)過期才清理;

2.4 客戶端分布式算法

1、根據(jù)余數(shù)計算分散

余數(shù)計算的方法簡單,數(shù)據(jù)的分散性也相當(dāng)優(yōu)秀,但也有其缺點(diǎn)。 那就是當(dāng)添加或移除服務(wù)器時,緩存重組的代價相當(dāng)巨大。 添加服務(wù)器后,余數(shù)就會產(chǎn)生巨變,這樣就無法獲取與保存時相同的服務(wù)器, 從而影響緩存的命中率。用Perl寫段代碼來驗(yàn)證其代價。

2、Consistent Hashing算法

余數(shù)分布式算法由于保存鍵的服務(wù)器會發(fā)生巨大變化而影響緩存的命中率,但Consistent Hashing中,只有在圓(continuum)上增加服務(wù)器的地點(diǎn)逆時針方向的第一臺服務(wù)器上的鍵會受到影響。

3.編碼實(shí)戰(zhàn)

4.常見問題

1、 緩存穿透

? ? ? ?緩存穿透是指查詢一個一定不存在的數(shù)據(jù),由于緩存是不命中時被動寫的,并且出于容錯考慮,如果從存儲層查不到數(shù)據(jù)則不寫入緩存,這將導(dǎo)致這個不存在的數(shù)據(jù)每次請求都要到存儲層去查詢,失去了緩存的意義。在流量大時,可能DB就掛掉了,要是有人利用不存在的key頻繁攻擊我們的應(yīng)用,這就是漏洞。

? ? ? ?最常見的則是采用布隆過濾器,將所有可能存在的數(shù)據(jù)哈希到一個足夠大的bitmap中,一個一定不存在的數(shù)據(jù)會被 這個bitmap攔截掉,從而避免了對底層存儲系統(tǒng)的查詢壓力。

? ? ? ?另外也有一個更為簡單粗暴的方法(我們采用的就是這種),如果一個查詢返回的數(shù)據(jù)為空(不管是數(shù) 據(jù)不存在,還是系統(tǒng)故障),我們?nèi)匀话堰@個空結(jié)果進(jìn)行緩存,但它的過期時間會很短,最長不超過五分鐘。

2、 緩存雪崩

? ? ? 緩存雪崩是指在我們設(shè)置緩存時采用了相同的過期時間,導(dǎo)致緩存在某一時刻同時失效,請求全部轉(zhuǎn)發(fā)到DB,DB瞬時壓力過重雪崩。

? ? ? 緩存失效時的雪崩效應(yīng)對底層系統(tǒng)的沖擊非??膳隆4蠖鄶?shù)系統(tǒng)設(shè)計者考慮用加鎖或者隊列的方式保證緩存的單線 程(進(jìn)程)寫,從而避免失效時大量的并發(fā)請求落到底層存儲系統(tǒng)上。

? ? ?一個簡單方案就時講緩存失效時間分散開,比如我們可以在原有的失效時間基礎(chǔ)上增加一個隨機(jī)值,比如1-5分鐘隨機(jī),這樣每一個緩存的過期時間的重復(fù)率就會降低,就很難引發(fā)集體失效的事件。

3、 緩存擊穿

? ? ? ?對于一些設(shè)置了過期時間的key,如果這些key可能會在某些時間點(diǎn)被超高并發(fā)地訪問,是一種非?!盁狳c(diǎn)”的數(shù)據(jù)。這個時候,需要考慮一個問題:緩存被“擊穿”的問題,這個和緩存雪崩的區(qū)別在于這里針對某一key緩存,前者則是很多key。

? ? ? ?緩存在某個時間點(diǎn)過期的時候,恰好在這個時間點(diǎn)對這個Key有大量的并發(fā)請求過來,這些請求發(fā)現(xiàn)緩存過期一般都會從后端DB加載數(shù)據(jù)并回設(shè)到緩存,這個時候大并發(fā)的請求可能會瞬間把后端DB壓垮。

1) 使用互斥鎖(mutex key)

2) "提前"使用互斥鎖(mutex key)

3) "永遠(yuǎn)不過期"

4) 資源保護(hù)

5.參考文獻(xiàn)

【轉(zhuǎn)】分布式緩存

【轉(zhuǎn)】詳解分布式緩存-Memcached及分布式實(shí)現(xiàn)方法

【轉(zhuǎn)】http://blog.51cto.com/9124573/1774564

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 分布式緩存技術(shù)PK:選擇Redis還是Memcached? 經(jīng)平臺同意授權(quán)轉(zhuǎn)載 作者:田京昆(騰訊后臺研發(fā)工程師)...
    meng_philip123閱讀 69,043評論 7 60
  • 轉(zhuǎn)載地址:http://gnucto.blog.51cto.com/3391516/998509 Redis與Me...
    Ddaidai閱讀 21,548評論 0 82
  • 一. 為什么使用緩存 如圖1,為了快速應(yīng)對早期的業(yè)務(wù)快速發(fā)展,我們架設(shè)一個超級簡單的Web服務(wù),只有一臺應(yīng)用服務(wù)器...
    大頭8086閱讀 2,589評論 0 5
  • 1、memcache的概念? Memcache是一個高性能的分布式的內(nèi)存對象緩存系統(tǒng),通過在內(nèi)存里維護(hù)一個統(tǒng)一的巨...
    桖辶殤閱讀 2,358評論 2 12
  • 那一年,大雪紛飛。她站在樹下瞭望遠(yuǎn)方,眼里的期待是那么的急切,算算看,這是有多久了。 那年她五歲,他七歲。 她站在...
    暮尹念閱讀 206評論 0 1

友情鏈接更多精彩內(nèi)容