愛我,就要懂我 – Memcached- 第284篇



  

相關歷史文章(閱讀本文以前,您可能須要先看下以前的系列前端

色談Java序列化:女孩子慎入 - 第280篇mysql

煩不煩,別再問我時間複雜度了:此次不色,女孩子進來吧 - 第281篇web

雙向鏈表,比西天還遠?- 第282篇面試

面試再也不怕,讓LRU無處可逃 - 第283篇redis

愛我,就要懂我 – Memcached- 第284篇算法

 

 

悟纖:師傅,最近非常煩人吶?sql

師傅:誰欺負我徒兒了?數據庫

悟纖:哎,最近數據庫壓力大,致使徒兒壓力也山大。後端

師傅:數據庫壓力大,緩存來解決,徒兒,趕忙上緩存吶。就如同如今這是全部的「妖怪」都是你在打,趕忙讓「八戒」攔一部分。這樣你的壓力就小了。緩存

悟纖:緩存這是什麼東東?

師傅:爲師今天就來給你普及下Memcached緩存。

BTW:緩存緩存,讓你的頭再也不疼。



 


1、何爲Memcached緩存

[百度百科」:

Memcached是一個自由開源的,高性能分佈式內存對象緩存系統。

Memcached是以LiveJournal旗下Danga Interactive公司的Brad Fitzpatric爲首開發的一款軟件。如今已成爲mixi、hatena、Facebook、Vox、LiveJournal等衆多服務中提升Web應用擴展性的重要因素。

Memcached是一種基於內存的key-value存儲,用來存儲小塊的任意數據(字符串、對象)。這些數據能夠是數據庫調用、API調用或者是頁面渲染的結果。

Memcached簡潔而強大。它的簡潔設計便於快速開發,減輕開發難度,解決了大數據量緩存的不少問題。它的API兼容大部分流行的開發語言。

通常的使用目的是,經過緩存數據庫查詢結果,減小數據庫訪問次數,以提升動態Web應用的速度、提升可擴展性。

「學深悟透」

       悟纖:這信息量很多吶,師傅梳理下唄。

       師傅:好吧,爲師用一句話概況下。

BTW:Memcached是一個基於K-V內存存儲、開源、免費、高性能的分佈式緩存系統。

       悟纖:師傅,徒兒理解了,

Memcached(MemoryCached)

就是使用K-V的方式進行內存儲存,性能比較高,支持分佈式處理。因爲將大部分的請求數據都由緩存進行處理返回,因此數據庫的壓力就減小了。

       師傅:爲師要給你32個贊。

 

2、Memcached的一些基本特性

       爲了對於Memcached有一個更好的認知,咱們須要對於Memcached的基本特性有一個簡單的理解,這樣一方面有助於對於Memcached的使用,另一方面也有助於技術的選型。

(1) Memcached是使用KV內存管理key的長度最大250字符value存儲最大爲1M,不支持複雜的數據類型(哈希、列表、集合等)。

(2)Memcached不支持持久化(不能存在磁盤,只能存儲在內存中)。

(3)Memcached支持key過時(過時時間最大能夠達到30天

(4)Memcached使用非阻塞IO複用網絡模型,使用監聽線程/工做線程的多線程模型

(5)Memcached基於c/s架構,協議簡單。

 

3、悟纖100問



 

3.1 key和value是否有限制

       Memcached是使用KV內存管理key的長度最大250字符value存儲最大爲1M。

3.2 memcached是用什麼技術實現key過時的?

       懶淘汰(lazy expiration)。

       Memcached 內部不會監視記錄是否過時,而是在get時查看記錄的時間戳,檢查記錄是否過時。這種技術被稱爲lazy(惰性)expiration。所以,Memcached不會在過時監視上耗費CPU時間。

 

 

3.3 刪除機制(緩存策略)

Memcached的緩存策略是LRU(最近最少使用)加上到期失效策略。當你在memcached內存儲數據項時,你有可能會指定它在緩存的失效時間。當memcached服務器用完分配的內時,失效的數據被首先替換,而後也是最近未使用的數據。在LRU中,memcached使用的是一種LazyExpiration策略,本身不會監控存入的key/vlue對是否過時,而是在獲取key值時查看記錄的時間戳,檢查key/value對空間是否過時,這樣可減輕服務器的負載。

BTW:Memcached的緩存策略就是LRU+到期失效;使用懶淘汰,當獲取key的時候觸發。

->LRU還不懂,公衆號「SpringBoot」能夠查看文章《面試再也不怕,讓LRU無處可逃

      

對於Memcached的LRU和咱們以前講的LRU有何區別吶?

->以後公衆號「SpringBoot」會有章節詳細說明Memcached的LRU《你懂她,惋惜你不懂我

 

3.4 存儲方式

內存存儲方式, 非持久性存儲。全部數據都保存在內存中,存取數據比硬盤快,當內存滿後,經過LRU算法自動刪除不使用的緩存,但沒有考慮數據的容災問題,重啓服務,全部數據會丟失。

 

3.5 Memcached分佈式是如何實現的

memcached自己是一個很是輕量級的服務,不支持主輔同步,也沒有集羣的概念。但爲了可擴展性,memcached服務器端和 memcached 客戶端結合起來能夠構成一個分佈式系統

 

在memcached分佈式系統中,各個 memcached 節點之間無須通訊,因此擴展性很是好。

->Memcached的分佈式特色:

•1>: 服務器端不關心分佈式:服務端的各個Memcached都是獨立部署,之間不相互通訊,這樣服務端部署多個Memcached就很簡單。

•2>: 依靠客戶端來實現分佈式:最簡單的方式就是客戶端擁有服務端全部鏈接地址,客戶端經過key的hash值獲取到對應的Memcached。

->以後公衆號「SpringBoot」會有章節詳細說明分佈式的算法《分佈式算法真是吊炸天

 

3.6 Memcached的集羣方案有哪些?

由於memcached的服務器並不支持集羣,因此有兩種方案支持

(1)代理端支持集羣(性能會有所損耗,大概20%);

(2)一種是客戶端支持集羣。

BTW:推薦使用客戶端。由上面可知通常的應用中memcached服務端集羣不用作太多工做,部署一堆memcached服務器就能夠了。

       Memcached集羣和web服務集羣是不同的, 全部Memcached的數據總和纔是數據庫的數據。每臺Memcached都是部分數據。((一臺memcached的數據,就是一部分mysql數據庫的數據))

 

3.7 Memcached碰到秒殺業務怎麼玩?

若是碰到電商秒殺等高併發的業務,必定要事先預熱,或者其它思想實現,例如:稱殺只是獲取資格,而不是瞬間秒殺到手商品。

       那麼什麼是獲取資格?就是在數據庫中,把0標成1.就有資格啦。再慢慢的去領取商品訂單。由於秒殺過程太長會佔用服務器資源。

BTW:核心就是事先預熱、獲取資格

       還記得12306的火車票餘票查詢嘛,一開始的時候,設計成時時更新餘票數量,後來調整爲有票無票,對於用戶而言,不關心還剩下多少票,關心的是有沒有票。搶票成功以後,就獲取了票的資格,至於下單支付在45分鐘內操做完成便可,不然票被釋放出來。

 

3.8 Memcached服務在業務應用場景中的工做流程

(1)查詢:當web程序須要訪問後端數據庫獲取數據時會優先訪問Memcached內存緩存,若是緩存中有數據就直接獲取返回前端服務及用戶,若是沒有數據(沒有命中),在由程序請求後端的數據庫服務器,獲取到對應的數據後,除了返回給前端服務及用戶數據外,還會把數據放到Memcached內存中進行緩存,等待下次請求被訪問,Memcache內存始終是數據庫的擋箭牌,從而大大的減輕數據庫的訪問壓力,提升整個網站架構的響應速度,提高了用戶體驗。

(2)更新:當程序更新,修改或刪除數據庫中已有的數據時,會同時發送請求通知Memcached已經緩存的同一個ID內容的舊數據失效,從而保證Memcache中數據和數據庫中的數據一致。

 

3.9 Memcached爲何性能高?

       memcached 性能高的緣由主要在於 libevent事件機制、多線程、全內存操做、模型簡單(時間複雜度 O(1),儘可能避免鎖機制)。

       memcached 全部的操做都是 O(1) (LRU算法),set/get 操做不該該出現滯後,一個請求正常狀況下不到 1ms 就能返回,若是遇到 Hang,那多是鏈接數過多、產生了 swap、遇到了網絡問題。

       配置相對較高的服務器,每秒能夠處理 200,000+ 的請求,即便在很慢的機器上,每秒處理幾百次也毫無壓力。 

->時間複雜度爲O(1)還不懂,公衆號「SpringBoot」能夠查看文章《煩不煩,別再問我時間複雜度了

 

3.10 memcache爲何能保證運行性能

       主要是經過提早分配內存,對於Memcached的內存模型,咱們在以後的章節會講到,本節就不過多展開了。

->以後公衆號「SpringBoot」會有章節詳細說明內存管理《內存管理,難於上青天

 

3.11 是否支持複雜的操做

和 redis 不同的是,memcached 沒有複雜的數據結構(好比隊列、集合),它只能存儲字符串類型,也不關心具體存儲什麼,這是它的一個優點:簡單。但不少人用的時候可能就不爽了,說它比 redis 弱爆了,其實雙方的應用場景不同。

       固然也能夠基於基本命令模擬一些數據結構,這是容許的,但這和memcached無關。

3.12 不多會出現內存碎片?

浪費存儲空間,來減小內存碎片。

對於Memcached內存是預先分配的,好比chunk=128B,那麼有一個item=100B,那麼就會浪費28B。

->以後公衆號「SpringBoot」會有章節詳細說明內存管理《內存管理,難於上青天

 

4、悟纖小結

       這節說的不少了,感受都很重要吶,仍是來作個簡單的總結吧:

(1)Memcached:Memcached是一個基於K-V內存存儲、開源、免費、高性能的分佈式緩存系統。(幾個關鍵詞要記住:內存,KV,高性能、分佈式)

(2)內存儲存:所有數據存放於內存中,無持久性存儲的設計,重啓服務器,內存裏的數據會丟失。(存放內存、不支持持久化)。

(3)KV儲存:使用key-value的方式儲存數據,key的最大長度是250個字符,value儲存最大值是1M。

(4)高性能原因:libevent事件機制、多線程、全內存操做、模型簡單、全部操做都是O(1)。

(5)分佈式實現:服務端正常部署,客服端實現。

(6)緩存策略:LRU+到期失效+懶淘汰。(不會監控存入的key/vlue對是否過時,而是在獲取key值時查看記錄的時間戳,當內存中緩存的數據容量達到啓動時設定的內存值時,就自動使用LRU算法刪除過時的緩存數據。)

BTW

Memcached是大佬,緩存它來搞;

內存KV儲存真有效;

多線程、libevent事件、內存操做性能高;

分佈式實現有一套,服務端無論,客戶端hash搞起真高檔;

緩存淘汰有策略,LRU算法最近最少就淘汰、到期無效key不要,

配上懶淘汰,淘汰淘汰Memcached真厲害。

我就是我,是顏色不同的煙火。
我就是我,是不同凡響的小蘋果。

à悟空學院:https://t.cn/Rg3fKJD

學院中有Spring Boot相關的課程!點擊「https://t.cn/Rg3fKJD」進行查看!

SpringBoot視頻:https://t.cn/R3QepWG

Spring Cloud視頻:https://t.cn/R3QeRZc

SpringBoot Shiro視頻:https://t.cn/R3QDMbh

SpringBoot交流平臺:https://t.cn/R3QDhU0

SpringData和JPA視頻:https://t.cn/R1pSojf

SpringSecurity5.0視頻:https://t.cn/EwlLjHh

Sharding-JDBC分庫分表實戰:https://t.cn/E4lpD6e


~視頻學習課程年度最低價 擊「閱讀原文」進行查看

相關文章
相關標籤/搜索