簡介Memcachedredis
Memcached 是一個高性能的分佈式內存對象緩存系統,用於動態Web應用以減輕數據庫負載。它經過在內存中緩存數據和對象來減小讀取數據庫的次數,從而提升動態、數據庫驅動網站的速度。Memcached基於一個存儲鍵/值對的hashmap。其守護進程(daemon )是用C寫的,可是客戶端能夠用任何語言來編寫,並經過memcached協議與守護進程通訊。算法
memcached是高性能的分佈式內存緩存服務器。它經過緩存數據庫查詢結果,減小數據庫訪問次數,以提升動態Web應用的速度、提升可擴展性。數據庫
Memcached的分佈式算法緩存
A.餘數哈希:根據服務器臺數的餘數進行哈希,求得鍵的哈希值,再處理服務器臺數,根據餘數選擇服務器,服務器
缺點:當添加或者移除服務器時,緩存重組的代價太大,網絡
當添加服務器,要進行重哈希,會致使原來的服務器序號變了,下一次找不到,訪問數據,Memcached命中率降低,那麼就增長了數據庫服務器的負載.數據結構
- 一致性哈希:一致性哈希是將整個哈希值空間組織成一個虛擬的圓環,如假設某哈希函數H的值空間是0~(2^32 -1)(即哈希值是一個32位的無符號整型),這個哈希空間爲環。而後讓每臺機器佔一個扇形空間。
Memcached的數據清除算法多線程
LRU。每一個slab會維護一個隊列,剛插入的數據在隊頭,常常get的數據也會移動到隊頭,這樣較老或者訪問較少的數據相對都留在隊尾。該算法從隊尾開始淘汰。當slab分配不到足夠的內存時,首先會檢查隊尾是否有過時數據。若是有的話會直接將其覆蓋爲新的對象,若是沒有,會開始淘汰隊尾的對象。分佈式
Slab是一個內存塊,它是memcached一次申請內存的最小單位。Slab的大小固定爲1M(1048576 Byte),一個slab由若干個大小相等的chunk組成。每一個chunk中都保存了一個item結構體、一對key和value。memcached
描述一下Memcacehd的工做流程
先檢查客戶端的請求數據是否在memcached中,若有,直接把請求數據返回,再也不對數據庫進行任何操做;若是請求的數據不在memcached中,就去查數據庫,把從數據庫中獲取的數據返回給客戶端,同時把數據緩存一份到memcached中(memcached客戶端不負責,須要程序明確實現);每次更新數據庫的同時更新memcached中的數據,保證一致性;當分配給memcached內存空間用完以後,會使用LRU(Least Recently Used,最近最少使用)策略加上到期失效策略,失效數據首先被替換,而後再替換掉最近未使用的數據。
Memcached 和 Redis的區別
1 、Redis不單單支持簡單的k/v類型的數據,同時還提供string(字符串)、list(鏈表)、set(集合)、zset(sorted set --有序集合)和hash(哈希類型)等數據結構的存儲。memcache支持簡單的k/v數據類型。
2 、Redis支持數據的備份,即master-slave模式的數據備份。
3 、Redis支持數據的持久化,能夠將內存中的數據保持在磁盤中,重啓的時候能夠再次加載進行使用,而Memecache把數據所有存在內存之中
四、 redis的速度比memcached快不少
五、Memcached是多線程,非阻塞IO複用的網絡模型;Redis使用單線程的IO複用模型。
小結:,有持久化需求或者對數據結構和處理有高級要求的應用,選擇redis,其餘簡單的key/value存儲,選擇memcached。對於二者的選擇須要要看具體的應用場景,若是須要緩存的數據只是key-value這樣簡單的結構時,則仍是採用memcache,它也足夠的穩定可靠。若是涉及到存儲,排序等一系列複雜的操做時,毫無疑問選擇redis。