相關歷史文章(閱讀本文以前,您可能須要先看下以前的系列)前端
煩不煩,別再問我時間複雜度了:此次不色,女孩子進來吧 - 第281篇web
悟纖:師傅,最近非常煩人吶?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