1. 程式人生 > >Memcached、Redis以及Memcached與Redis的區別

Memcached、Redis以及Memcached與Redis的區別

一、Memcached 1.Memcached:是一個高效能的分散式記憶體物件快取系統,通過在記憶體裡維護一個統一的巨大的hash表,它能夠用來儲存各種資料結構。簡單的說就是將資料調到記憶體中,然後從記憶體中讀取,從而大大提高讀取速度。 2.Memcached的工作流程: 先檢查客戶端的請求是否在Memcached中,如有,直接把請求返回,不再對資料庫進行任何的操作; 如果請求不再Memcached中,就去查資料庫,把從資料庫中獲取的資料返回給客戶端,同時把資料快取一份到Memcached中。 每次更新資料庫時的同時要更新Memcached中的資料,保證一致性;
3.Memcached的回收機制: 當分配給Memcached的記憶體空間用完後會使用LRU(最近最少使用)策略加上到期失效策略,失效資料首先被替換,然後再替換掉最近未使用的資料(懶漢式刪除)。 4.Memcached的記憶體管理機制:         如果有個新的快取資料要被存放,Memcached首先選擇一個合適的slab,然後檢視該slab是否還有空閒的chunk,如果有直接存放進去;如果沒有則要進行申請。slab申請記憶體以page(一個page 1M=1024*1024)為單位,多以在放第一個資料,無論大下,都會有1M大小的page被分配給slab。申請到page後,slab會將這個的記憶體按照chunk的大小進行切分,這樣就變成了一個chunk的陣列,在從這個chunk陣列中選擇一個用於儲存資料。

5.Memcached淘汰機制:

如果此時又來了一個新的元素123B,那麼就會觸發memcached的淘汰機制了。memcached首先會檢視180Bslab是否存在過期的元素,如果存在,則先清理部分,預留空位。如果180B這個slab的資料都比較熱(沒有過期),則按LRU進行淘汰。需要注意的是,淘汰是在slab內部進行的,也即在上面的場景中只有180Bslab內部進行淘汰剔除,對於其他的slab,是沒有受到影響的。memcached也不會回收比較空餘的其他slabpage。也即一個page被分配給某個slab後,他將一直被這個slab

所佔用,永遠無法被mc回收,直到memcached重啟。

這個特性被稱為Memcached的鈣化問題:Memcached在線上跑了一段時間後,記憶體按原始訪問模式分配記憶體。當訪問模式變更後,原有的分配模式可能導致快取頻繁出現數據剔除問題。最典型的場景即為記憶體尚有空餘,但一直有資料被剔除,命中率一直上不去。對於這種情況,解決方法為重啟快取。


二、Redis 1.讀寫速度快:速寫速度分別為110000次/s、81000次/s; 2.可持久化:將記憶體的資料儲存到磁碟中,持久化的方式為:   a.RDB(定時快照):將記憶體中的資料以快照的方式寫入到二進位制檔案中,預設的檔名為dump,rdb。可以通過配置設定自動做快照持久化的方式。 RDB的缺點是:定時快照只是代表一段時間內的記憶體映像,所以系統重啟會丟失上次快照與重啟之間所有的資料。   b.AOF(基於語句追加方):Redis將收到的命令都通過write函式追加到檔案中,當Redis重啟的時候會通過重新執行檔案中儲存的寫的命令,在記憶體中重建整個資料庫內容。 缺點是:AOF方式持久化還是可能會丟失部分修改;log檔案體積過大時系統重啟恢復資料非常慢,幾十G的資料可能要幾小時才能載入完;每條命令都要寫log,讀寫效能會有所下降。        持久化檔案會越來越大,例如我們呼叫incrtest命令100次,檔案中必須儲存全部的100條命令,其實有99條都是多餘的。因為要恢復資料庫的狀態其實檔案中儲存一條set test 100就夠了。為了壓縮aof的持久化檔案。redis提供了bgrewriteaof命令。收到此命令redis將使用與快照類似的方式將記憶體中的資料 以命令的方式儲存到臨時檔案中,最後替換原來的檔案。 AOF重寫:建立一個新的AOF檔案來代替原有的AOF檔案,新AOF檔案和原有的AOF檔案儲存的資料庫狀態完全一樣,但是新的AOF檔案體積小於等於原有AOF檔案的體積。 AOF後臺重寫: 1).子程序進行AOF重寫期間,主程序繼續處理命令請求; 2).子程序帶有主程序的資料副本,使用了程序而不是執行緒,可以在避免死鎖的情況下,保證資料的安全性; 子程序在進行AOF重寫的期間,主程序還要繼續處理命令,而新的命令可能對現有的資料進行更改,這會讓當前資料庫的資料和重寫後的AOF檔案中的資料不一致。 a.處理命令請求; b.將寫命令追加到AOF檔案中; c.將寫命令追加到AOF重寫快取中; 將AOF重寫快取中的內容全部寫入到新的AOF檔案中,對新的AOF檔案進行改名,覆蓋原有的AOF檔案; 3.支援五種資料結構 :String,List,Set,zSet,Hash; 4.原子操作 :Redis對不同資料型別的操作都是原子性的; 5.Redis支援多種語言 :Python,PHP; 6.主-從複製 主-從複製的特點 1).一個master可以有多個slave; 2).除了多個slave連到相同的master外,slave也可以連線到其他的slave上; 3).主從複製不會阻塞master,當一個或多個slave與master初次同步資料時,master可以處理客戶端發來的請求。相反slave在初次同步資料時則會阻塞不能處理客戶端的請求; 4).主從複製可以用來提高體統的可伸縮性; 5).可以在master禁用資料持久化,只需要註解掉master配置檔案中的所有save配置,然後只在slave上配置持久化; 主-從複製的過程 1).當設定好slave伺服器後,slave會建立和master的連線,然後傳送sync命令。 2).無論是第一次同步建立的連線還是連線斷開後的重新連 接,master都會啟動一個後臺程序,將資料庫快照儲存到檔案中,同時master主程序會開始收集新的寫命令並快取起來。    3).後臺程序完成寫檔案後,master就傳送檔案給slave,slave將檔案儲存到磁碟上,然後載入到記憶體恢復資料庫快照到slave上。        4).接著master就會把快取的命 令轉發給slave。而且後續master收到的寫命令都會通過開始建立的連線傳送給slave。如果master同時收到多個slave發來的同步連線命令,只會使用啟動一個程序來寫資料庫映象,然後傳送給所有slave;     7.Redis的記憶體管理機制              Redis會快取所有的key資訊,如果Redis發現記憶體的使用量超過了某一個閥值,將會觸發swap操作,計算出哪些key對應的value需要swap到磁碟上,然後將這些key對應的value持久化到磁碟上,同時在記憶體中清除;     當從Redis中讀取資料的時候,如果讀取的key對應的value不在記憶體中,那麼Redis就從swap檔案中載入相應的資料,然後返回;     8.Redis過期策略—懶漢式刪除+定期刪除     1).定期刪除:     每隔一段時間執行一次刪除過期的key;     2).懶漢式刪除:     key過期的時候不刪除,每次通過key獲取值得時候,而且只刪除當前key,所以對cpu佔用比較少    缺點是:大量的過期的key一直沒有被獲取則會造成記憶體洩漏;
    三、Memcached與Redis的區別:      1).永續性:Redis支援資料持久化,Memcached不支援;     2).資料型別:Redis支援String,List,Set,zSet,hash,Memcached之間簡單的資料型別;     3).主-從複製:Redis支援,Memcached不支援;     4).記憶體管理機制:Memcached使用預分配的記憶體池的方式,使用slab和大小不同的chunk來管理記憶體,Item會根據大小選合適的chunk儲存,Redis使用現場申請記憶體的方式來儲存資料;