memcached是高性能的分佈式內存緩存服務器。通常的使用目的是,經過緩存數據庫查詢結果,減小數據庫訪問次數,以提升動態Web應用的速度、提升可擴展性。php
memcached的API使用32位元的循環冗餘校驗(CRC-32)計算鍵值後,將資料分散在不一樣的機器上。當表格滿了之後,接下來新增的資料會以LRU機制替換掉。因爲memcached一般只是看成快取系統使用,因此使用memcached的應用程式在寫回較慢的系統時(像是後端的數據庫)須要額外的程式碼更新memcached內的資料html
Memcached基於一個存儲鍵/值對的hashmap。其守護進程(daemon
)是用C寫的,可是客戶端能夠用任何語言來編寫,並經過memcached協議與守護進程通訊node
http://nl1.php.net/manual/zh/...算法
Memcache安裝完成以後,能夠設置哈希策略,memcache.hash_strategy。目前有standard模式和consistent模式。standard模式其實就是%,即取模。而consistent,就是hash的一致性算法。數據庫
在Memcache中,hash策略在php.ini文件中設置後端
[Memcache] Memcache.allow_failover = 1 Memcache.hash_strategy =consistent Memcache.hash_function =crc32
餘數分佈算法緩存
假若有2臺服務器node0,node1和node2,當hashcode=5時,5%3=2,就路由到第3臺機器。可是若是其中node2服務down以後,那麼全部路由到node2的數據都會丟失服務器
後期若是業務增加後,須要增長node4,那麼以前的全部數據又要失效了,因此不方便擴展數據結構
一致性分佈算法(基於libketama)分佈式
簡單說來,一致性hash算法就是先把服務器也經過某一個特徵(如IP/MAC地址)hash一下,這樣服務器會按照分佈(可能不均勻)在一個範圍,而後把key再hash一下,而後看key最近的下個服務器做爲該key的存儲bin。
這樣,若是增長一臺服務器,從新分配的key只是分佈再新增的這個服務器和上一個最近的服務器之間的key,其他的都不變。
http://blog.csdn.net/kongqz/a...
Hash表是Memcached裏面最重要的結構之一,其採用連接法來處理Hash衝突(和php解決hash衝突同樣,鏈地址法),當Hash表中的項太多時,也就是Hash衝突比較高的時候,Hash表的遍歷就脫變成單鏈表,此時爲了提供Hash的性能,Hash表須要擴容,Memcached的擴容條件是當表中元素個數超過Hash容量的1.5倍時就進行擴容,擴容過程由獨立的線程來完成,擴容過程當中會採用2個Hash表,將老表中的數據經過Hash算法映射到新表中,每次移動的桶的數目能夠配置,默認是每次移動老表中的1個桶。
http://blog.csdn.net/liziyun5...
把數據組裝成 item 以前, 必須爲 item 分配存儲空間, memcached 不是直接從操做系統分配內存的,
memcached內部使用了相似內存池的東西, 即slab機制, 來管理內存. 內存的分配和回收都交給 slab 子系統實現。
memcached 中, 內存的分配和回收, 都是經過 slab 實現的, slab機制至關於內存池機制,
實現從操做系統分配一大塊內存, 而後 memcached 本身管理這塊內存, 負責分配與回收
像通常的內存池同樣, 從操做系統分配到一大塊內存後, 爲了方便管理, 把這大塊內存劃分爲各類大小的 chunk,
chunk的大小按照必定比例逐漸遞增, 以下圖所示:
從 slab 分配內存的時候, 根據請求內存塊的大小, 找到大小最合適的 chunk 所在的 slabclass, 而後從這個slabclass 找空閒的 chunk 分配出去. 所謂最合適就是指 chunk 的大小可以知足要求, 並且碎片最小。以下圖:
這種分配方式的缺點是存在內存碎片, 例如, 將 100字節的 item 存儲到一個 128 字節的 chunk, 就有 28 字節的內存浪費, 以下圖所示:
slabclass 是由 chunk size 肯定的, 同一個 slabclass 內的 chunk 大小都同樣, 每個
slabclass 要負責管理 一些內存, 初始時, 系統爲每一個 slabclass 分配一個 slab, 一個 slab
就是一個內存塊, 其大小等於 1M. 而後每一個 slabclass 再把 slab 切分紅一個個 chunk, 算一下, 一個
slab 能夠切分獲得 1M/chunk_size 個chunk
一個slabclass分配一個slab
一個slab分紅多個chunk(同一個slab中chunk相等)
一個chunk就是一個item(這個item不必定所有利用)
Magent代理
http://blog.csdn.net/qwe61120...
參考資料:
http://www.cnblogs.com/xrq730...
memcache源碼分析
http://blog.csdn.net/column/d...
http://blog.csdn.net/lcli2009...
http://www.jianshu.com/p/fcf9...