在大型海量併發訪問網站及openstack等集羣中,對於關係型數據庫,尤爲是大型關係型數據庫,若是對其進行每秒上萬次的併發訪問,而且每次訪問都在一個有上億條記錄的數據表中查詢某條記錄時,其效率會很是低,對數據庫而言,這也是沒法承受的。javascript
做用:
緩衝系統的使用能夠很好的解決大型併發數據訪問所帶來的效率低下和數據庫壓力等問題,緩存系統將常用的活躍數據存儲在內存中避免了訪問重複數據時,數據庫查詢所帶來的頻繁磁盤i/o和大型關係表查詢時的時間開銷,所以緩存系統幾乎是大型網站的必備功能模塊。php
對比:java
緩存系統能夠認爲是基於內存的數據庫,相對於後端大型生產數據庫而言基於內存的緩存數據庫可以提供快速的數據訪問操做,從而提升客戶端的數據請求訪問反饋,並下降後端數據庫的訪問壓力。python
定義:Memcached 是一個開源的、高性能的分佈式內存對象緩存系統。web
做用(3):通過在內存中緩存數據和對象來減小讀取數據庫的次數,從而提升網站訪問速度,加速動態WEB應用、減輕數據庫負載。
Memcached是一種內存緩存,把常常須要存取的對象或數據緩存在內存中,內存中,緩存的這些數據經過API的方式被存取,數據通過利用HASH以後被存放到位於內存上的HASH表內,HASH表中的數據以key-value的形式存放,因爲Memcached沒有實現訪問認證及安全管理控制,所以在面向internet的系統架構中,Memcached服務器一般位於用戶的安全區域。ajax
最少使用算法:
當Memcached服務器節點的物理內存剩餘空間不足,Memcached將使用最近最少使用算法(LRU,LastRecentlyUsed)對最近不活躍的數據進行清理,從而整理出新的內存空間存放須要存儲的數據。redis
優點(3):算法
Memcached在解決大規模集羣數據緩存的諸多難題上有具備很是明顯的優點而且還易於進行二次開發,所以愈來愈多的用戶將其做爲集羣緩存系統,此外,Memcached開放式的API,使得大多數的程序語言都能使用Memcached,如javac、C/C++C#,Perl、python、PHP、Ruby 各類流行的編程語言。數據庫
應用(3):
因爲Memcached的諸多優點,其已經成爲衆多開源項目的首選集羣緩存系統。如openstacksd的keystone身份認證項目。就會利用Memcached來緩存租戶的Token等身份信息,從而在用戶登錄驗證時無需查詢存儲在MySQL後端數據庫中的用戶信息,這在數據庫高負荷運行下的大型openstack集羣中可以極大地提升用戶的身份驗證過程,在如web管理界面Horizon和對象存儲Swift項目也都會利用Memcached來緩存數據以提升客戶端的訪問請求響應速率。編程
一、MemCache是項目的名稱
二、MemCached是MemCache服務器端能夠執行文件的名稱
MemCache的官方網站爲http://memcached.org/
1. 檢查客戶端請求的數據是否在 Memcache 中,若是存在,直接將請求的數據返回。
2. 若是請求的數據不在 Memcache 中,就去數據庫查詢,把從數據庫中獲取的數據返回給客戶端,同時把數據緩存一份 Memcache 中
3. 每次更新數據庫的同時更新 Memcache 中的數據庫。確保數據信息一致性。
4. 當分配給 Memcache 內存空間用完後,會使用LRU(least Recently Used ,最近最少使用 ) 策略加到其失效策略,失效的數據首先被替換掉,而後在替換掉最近未使用的數據。
1. 協議簡單
其使用基於文本行的協議,能直接經過 telnet 在Memcached 服務器上存取數據
2. 基於 libevent 的事件處理
libevent 利用 C 開發的程序庫,它將 BSD 系統的kqueue,Linux 系統的 epoll 等事件處理功能封裝成爲一個接口,確保即便服務器端的連接數。加也能發揮很好的性能。 Memcached 利用這個庫進行異步事件處理。
3. 內置的內存管理方式
Memcached 有一套本身管理內存的方式,這套方式很是高效,全部的數據都保存在Memcached內置的內存中,當存入的數據佔滿空間時,使用 LRU 算法自動刪除不使用的緩存,即重用過時的內存空間。Memecached 不考慮數據的容災問題,一旦重啓全部數據所有丟失。
4. 節點相互獨立的分佈式
各個 Memecached 服務器之間互不通訊,都是獨立的存取數據,不共享任何信息。經過對客戶端的設計,讓 Memcached 具備分佈式,能支持海量緩存和大規模應用。
1. Memcached服務單點故障
在Memcached集羣系統中每一個節點獨立存取數據,彼此不存在數據同步鏡像機制,若是一個Memcached節點故障或者重啓,則該節點緩存在內存的數據所有會丟失,再次訪問時數據再次緩存到該服務器
2. 存儲空間限制
Memcache緩存系統的數據存儲在內存中,必然會受到尋址空間大小的限制,32爲系統能夠緩存的數據爲2G,64位系統緩存的數據能夠是無限的,要看Memcached服務器物理內存足夠大便可
3. 存儲單元限制
Memcache緩存系統以 key-value 爲單元進行數據存儲,可以存儲的數據key尺寸大小爲250字節,可以存儲的value尺寸大小爲1MB,超過這個值不容許存儲
4. 數據碎片
Memcache緩存系統的內存存儲單元是按照Chunk來分配的,這意味着不可能,全部存儲的value數據大小正好等於一個Chunk的大小,所以必然會形成內存碎片,而浪費存儲空間
5. 利舊算法侷限性
Memcache緩存系統的LRU算法,並非針對全局空間的存儲數據的,而是針對Slab的,Slab是Memcached中具備一樣大小的多個Chunk集合
6.數據訪問安全性
Memcache緩存系統的慢慢Memcached服務端並沒有相應的安全認證機制經過,經過非加密的telnet鏈接便可對Memcached服務器端的數據進行各類操做
一、存儲方式不一樣
memecache 把數據所有存在內存之中,斷電後會掛掉,數據不能超過內存大小;redis有部份存在硬盤上,這樣能保證數據的持久性,支持數據的持久化
二、數據支持類型不一樣
redis在數據支持上要比memecache多的多。
三、使用底層模型不一樣
新版本的redis直接本身構建了VM 機制 ,由於通常的系統調用系統函數的話,會浪費必定的時間去移動和請求。
四、運行環境不一樣
redis目前官方只支持LINUX 上運行,從而省去了對於其它系統的支持,這樣的話能夠更好的把精力用於本系統 環境上的優化,雖而後來微軟有一個小組爲其寫了補丁。可是沒有放到主幹上。
MemCache雖然被稱爲"分佈式緩存",可是MemCache自己徹底不具有分佈式的功能,MemCache集羣之間不會相互通訊(與之造成對比的,好比JBoss Cache,某臺服務器有緩存數據更新時,會通知集羣中其餘機器更新緩存或清除緩存數據),所謂的"分佈式",徹底依賴於客戶端程序的實現,就像上面這張圖的流程同樣。
同時基於這張圖,理一下MemCache一次寫緩存的流程:
一、應用程序輸入須要寫緩存的數據
二、API將Key輸入路由算法模塊,路由算法根據Key和MemCache集羣服務器列表獲得一臺服務器編號
三、由服務器編號獲得MemCache及其的ip地址和端口號
四、API調用通訊模塊和指定編號的服務器通訊,將數據寫入該服務器,完成一次分佈式緩存的寫操做
讀緩存和寫緩存同樣,只要使用相同的路由算法和服務器列表,只要應用程序查詢的是相同的Key,MemCache客戶端老是訪問相同的客戶端去讀取數據,只要服務器中還緩存着該數據,就能保證緩存命中。
這種MemCache集羣的方式也是從分區容錯性的方面考慮的,假如Node2宕機了,那麼Node2上面存儲的數據都不可用了,此時因爲集羣中Node0和Node1還存在,下一次請求Node2中存儲的Key值的時候,確定是沒有命中的,這時先從數據庫中拿到要緩存的數據,而後路由算法模塊根據Key值在Node0和Node1中選取一個節點,把對應的數據放進去,這樣下一次就又能夠走緩存了,這種集羣的作法很好,可是缺點是成本比較大。
上面說過,已知MemCache的某個節點,直接telnet過去,就可使用各類命令操做MemCache了,下面看下MemCache有哪幾種命令:
命 令 |
做 用 |
get |
返回Key對應的Value值 |
add |
添加一個Key值,沒有則添加成功並提示STORED,有則失敗並提示NOT_STORED |
set |
無條件地設置一個Key值,沒有就增長,有就覆蓋,操做成功提示STORED |
replace |
按照相應的Key值替換數據,若是Key值不存在則會操做失敗 |
stats |
返回MemCache通用統計信息(下面有詳細解讀) |
stats items |
返回各個slab中item的數目和最老的item的年齡(最後一次訪問距離如今的秒數) |
stats slabs |
返回MemCache運行期間建立的每一個slab的信息(下面有詳細解讀) |
version |
返回當前MemCache版本號 |
flush_all |
清空全部鍵值,但不會刪除items,因此此時MemCache依舊佔用內存 |
quit |
關閉鏈接 |