memcache是一個高性能的分佈式的內存對象緩存系統,用於動態Web應用以減輕數據庫負擔。它經過在內存中緩存數據和對象,來減小讀取數據庫的次數。從而提升動態、數據庫驅動網站速度。html
memcache經過在內存裏維護一個統一的巨大的hash表,它可以用來存儲各類格式的數據,包括圖像、視頻、文件以及數據庫檢索的結果等。memcache主要用於分擔數據庫負的壓力,memcache將數據調用到內存中,而後從內存中讀取,從而大大提升讀取速度。redis
memcached 的目前版本是經過C實現,採用了單進程、單線程、異步I/O,基於事件(event_based)的服務方式.使用libevent做爲事件通知實現。多個Server能夠協同工做,但這些 Server 之間是沒有任何通信聯繫的,每一個Server只是對本身的數據進行管理。Client端經過指定Server端的ip地址(經過域名應該也能夠)。須要緩存的對象或數據是以key->value對的形式保存在Server端。key的值經過hash進行轉換,根據hash值把value傳遞到對應的具體的某個Server上。當須要獲取對象數據時,也根據key進行。首先對key進行hash,經過得到的值能夠肯定它被保存在了哪臺Server上,而後再向該Server發出請求。Client端只須要知道保存hash(key)的值在哪臺服務器上就能夠了。算法
memcached的內存算法:
Memcached利用slab allocation機制來分配和管理內存,它按照預先規定的大小,將分配的內存分割成特定長度的內存塊,再把尺寸相同的內存塊分紅組,數據在存放時,根據鍵值大小去匹配slab大小,找就近的slab存放,因此存在空間浪費現象。
傳統的內存管理方式是,使用完經過malloc分配的內存後經過free來回收內存,這種方式容易產生內存碎片並下降操做系統對內存的管理效率。數據庫
Memcached的緩存策略:
Memcached的緩存策略是LRU(最近最少使用)加上到期失效策略。當你在memcached內存儲數據項時,你有可能會指定它在緩存的失效時間,默認爲永久。當memcached服務器用完分配的內時,失效的數據被首先替換,而後也是最近未使用的數據。在LRU中,memcached使用的是一種Lazy Expiration策略,本身不會監控存入的key/vlue對是否過時,而是在獲取key值時查看記錄的時間戳,檢查key/value對空間是否過時,這樣可減輕服務器的負載。緩存
分佈式算法(Consistent Hashing):服務器
選擇服務器算法有兩種,一種是根據餘數來計算分佈,另外一種是根據散列算法來計算分佈。
餘數算法:
先求得鍵的整數散列值,再除以服務器臺數,根據餘數肯定存取服務器,這種方法計算簡單,高效,但在memcached服務器增長或減小時,幾乎全部的緩存都會失效。
散列算法:
先算出memcached服務器的散列值,並將其分佈到0到2的32次方的圓上,而後用一樣的方法算出存儲數據的鍵的散列值並映射至圓上,最後從數據映射到的位置開始順時針查找,將數據保存到查找到的第一個服務器上,若是超過2的32次方,依然找不到服務器,就將數據保存到第一臺memcached服務器上。若是添加了一臺memcached服務器,只在圓上增長服務器的逆時針方向的第一臺服務器上的鍵會受到影響。異步
Redis是一個開源,先進的key-value存儲,並用於構建高性能,可擴展的Web應用程序的完美解決方案。分佈式
Redis從它的許多競爭繼承來的三個主要特色:memcached
Redis數據庫徹底在內存中,使用磁盤僅用於持久性。函數
相比許多鍵值數據存儲,Redis擁有一套較爲豐富的數據類型。
Redis能夠將數據複製到任意數量的從服務器。
Redis 優點:
異常快速:Redis的速度很是快,每秒能執行約11萬集合,每秒約81000+條記錄。
支持豐富的數據類型:Redis支持最大多數開發人員已經知道像列表,集合,有序集合,散列數據類型。這使得它很是容易解決各類各樣的問題,由於咱們知道哪些問題是能夠處理經過它的數據類型更好。
操做都是原子性:全部Redis操做是原子的,這保證了若是兩個客戶端同時訪問的Redis服務器將得到更新後的值。
多功能實用工具:Redis是一個多實用的工具,能夠在多個用例如緩存,消息,隊列使用(Redis原生支持發佈/訂閱),任何短暫的數據,應用程序,如Web應用程序會話,網頁命中計數等。
一、存儲方式:
memecache 把數據所有存在內存之中,斷電後會掛掉,數據不能超過內存大小
redis有部份存在硬盤上,這樣能保證數據的持久性,支持數據的持久化(筆者注:有快照和AOF日誌兩種持久化方式,在實際應用的時候,要特別注意配置文件快照參數,要不就頗有可能服務器頻繁滿載作dump)。
二、數據支持類型:
redis在數據支持上要比memecache多的多。
三、使用底層模型不一樣:
新版本的redis直接本身構建了VM 機制 ,由於通常的系統調用系統函數的話,會浪費必定的時間去移動和請求。
四、分佈式環境:
memcached的分佈式由客戶端實現,經過一致性哈希算法來保證訪問的緩存命中率;Redis的分佈式由服務器端實現,經過服務端配置來實現分佈式;
本節主要介紹memcache的原理分析。redis就一帶而過了。有興趣的能夠參考我以前介紹redis的博客。但願對你們有幫助https://www.cnblogs.com/huhongy/category/1093687.html