關於memcache和Redis的區別和總結

來源:互聯網
上載者:User
關於memcache和Redis的區別和總結

Redis和Memcached整體對比

1)效能對比:由於Redis只使用單核,而Memcached可以使用多核,所以平均每一個核上Redis在儲存小資料時比Memcached效能更高。而在100k以上的資料中,Memcached效能要高於Redis,雖然Redis最近也在儲存大資料的效能上進行最佳化,但是比起 Memcached,還是稍有遜色。2)記憶體使用量效率對比:使用簡單的key-value儲存的話,Memcached的記憶體利用率更高,而如果Redis採用hash結構來做key-value儲存,由於其組合式的壓縮,其記憶體利用率會高於Memcached。3)Redis支援伺服器端的資料操作:Redis相比Memcached來說,擁有更多的資料結構和並支援更豐富的資料操作,通常在Memcached 裡,你需要將資料拿到用戶端來進行類似的修改再set回去。這大大增加了網路IO的次數和資料體積。在Redis中,這些複雜的操作通常和一般的 GET/SET一樣高效。所以,如果需要緩衝能夠支援更複雜的結構和操作,那麼Redis會是不錯的選擇。
1 2 3 4 5 6

簡單地比較Redis與Memcached的區別

1 Redis不僅僅支援簡單的k/v類型的資料,同時還提供list,set,zset,hash等資料結構的儲存。2 Redis支援資料的備份,即master-slave模式的資料備份。3 Redis支援資料的持久化,可以將記憶體中的資料保持在磁碟中,重啟的時候可以再次載入進行使用。
1 2 3 4 5 6

詳細地比較Redis與Memcached的區別:

<1> 什麼是memcache,適用memcached的業務情境有哪些。memcached的cache機制是怎樣的。在設計應用時,可以通過Memcached緩衝那些內容。
1 2
    Memcached其本質上就是一個記憶體key-value資料庫,但是不支援資料的持久化,伺服器關閉之後資料全部丟失。Memcached使用C語言開發,在大多數像Linux、BSD和Solaris等POSIX系統上,只要安裝了libevent即可使用。在Windows下,它也有一個可用的非官方版本(http://code.jellycan.com/memcached/)。1. memcache的基本配置1)啟動Memcache的伺服器端 # /usr/local/bin/memcached -d -m 10 -u root -l 192.168.0.200 -p 12000 -c 256 -P /tmp/memcached.pid-d選項是啟動一個守護進程, -m是分配給Memcache使用的記憶體數量,單位是MB,我這裡是10MB, -u是運行Memcache的使用者,我這裡是root, -l是監聽的伺服器IP地址,如果有多個地址的話,我這裡指定了伺服器的IP地址192.168.0.200, -p是設定Memcache監聽的連接埠,我這裡設定了12000,最好是1024以上的連接埠, -c選項是最大啟動並執行並發串連數,預設是1024,我這裡設定了256,按照你伺服器的負載量來設定, -P是設定儲存Memcache的pid檔案,我這裡是儲存在 /tmp/memcached.pid2)如果要結束Memcache進程,執行:# kill `cat /tmp/memcached.pid`    雜湊演算法將任意長度的二進位值對應為固定長度的較小二進位值,這個小的二進位值稱為雜湊值。雜湊值是一段資料唯一且極其緊湊的數值表示形式。如果散列一段明文而且哪怕只更改該段落的一個字母,隨後的雜湊都將產生不同的值。要找到散列為同一個值的兩個不同的輸入,在計算上是不可能的。2、一致性Hash演算法的目的有兩點:一是節點變動後其他節點受影響儘可能小;二是節點變動後資料重新分配儘可能均衡 。3、為什麼要運行 memcached 。如果網站的高流量很大並且大多數的訪問會造成資料庫高負荷的狀況下,使用 memcached 能夠減輕資料庫的壓力。4、適用memcached的業務情境。1)如果網站包含了訪問量很大的動態網頁,因而資料庫的負載將會很高。由於大部分資料庫請求都是讀操作,那麼memcached可以顯著地減小資料庫負載。2)如果資料庫伺服器的負載比較低但CPU使用率很高,這時可以緩衝計算好的結果( computed objects )和渲染後的網頁模板(enderred templates)。3)利用memcached可以緩衝 session資料 、臨時資料以減少對他們的資料庫寫操作。4)緩衝一些很小但是被頻繁訪問的檔案。5)緩衝Web 'services'(非IBM宣揚的Web Services,譯者注)或RSS feeds的結果.。5、不適用memcached的業務情境。1)緩衝對象的大小大於1MBMemcached本身就不是為了處理龐大的多媒體(large media)和巨大的二進位塊(streaming huge blobs)而設計的。2)key的長度大於250字元3)虛擬機器主機不讓運行memcached服務     如果應用本身託管在低端的虛擬私人伺服器上,像vmware, xen這類虛擬化技術並不適合運行memcached。Memcached需要接管和控制大塊的記憶體,如果memcached管理的記憶體被OS或 hypervisor交換出去,memcached的效能將大打折扣。4)應用運行在不安全的環境中    Memcached為提供任何安全性原則,僅僅通過telnet就可以訪問到memcached。如果應用運行在共用的系統上,需要著重考慮安全問題。5)業務本身需要的是持久化資料或者說需要的應該是database6.memcached是怎麼工作的。    Memcached的高效能源於兩階段雜湊(two-stage hash)結構。Memcached就像一個巨大的、儲存了很多<key,value>對的雜湊表。通過key,可以儲存或查詢任意的資料。 用戶端    可以把資料存放區在多台memcached上。當查詢資料時,用戶端首先參考節點列表計算出key的雜湊值(階段一雜湊),進而選中一個節點;用戶端將請求發送給選中的節點,然後    memcached節點通過一個內部的雜湊演算法(階段二雜湊),尋找真正的資料(item)並返回給用戶端。從實現的角度看,memcached是一個非阻塞的、基於事件的伺服器程式。7、memcached最大的優勢是什麼。    Memcached最大的好處就是它帶來了極佳的水平可擴充性,特別是在一個巨大的系統中。由於用戶端自己做了一次雜湊,那麼我們很容易增加大量memcached到叢集中。memcached之間沒有相互連信,因此不會增加 memcached的負載;沒有多播協議,不會網路通訊量爆炸(implode)。8、memcached和MySQL的query cache相比,有什麼優缺點。缺點:1)相比MySQL的query cache,把memcached引入應用中需要不少的工作量。MySQL的query cache,可以自動地緩衝SQL查詢的結果,被緩衝的SQL查詢可以被反覆、快速的執行。優點:1)當修改表時,MySQL的query cache會立刻被重新整理(flush)。當寫操作很頻繁時,MySQL的query cache會經常讓所有快取資料都失效。2)在多核CPU上,MySQL的query cache會遇到擴充問題(scalability issues)。在多核CPU上,query cache會增加一個全域鎖(global lock), 由於需要重新整理更多的快取資料,速度會變得更慢。3)在MySQL的query cache中,是不能儲存任意的資料的(只能是SQL查詢結果)。利用memcached,我們可以搭建出各種高效的緩衝。比如,可以執行多個獨立的查詢,構建出一個使用者物件(user object),然後將使用者物件緩衝到memcached中。而query cache是SQL語句層級的,不可能做到這一點。在小的網站中,query cache會有所協助,但隨著網站規模的增加,query cache的弊將大於利。4)query cache能夠利用的記憶體容量受到MySQL伺服器空閑記憶體空間的限制。給資料庫伺服器增加更多的記憶體來快取資料,固然是很好的。但是,有了memcached,只要您有閒置記憶體,都可以用來增加memcached叢集的規模,然後您就可以緩衝更多的資料。9、memcached和伺服器的local cache(比如PHP的APC、mmap檔案等)相比,有什麼優缺點。1)首先,local cache面臨著嚴重的記憶體限制,能夠利用的記憶體容量受到(單台)伺服器空閑記憶體空間的限制。2)local cache有一點比memcached和query cache都要好,那就是它不但可以儲存任意的資料,而且沒有網路存取的延遲。因此,local cache的資料查詢更快。考慮把highly common的資料放在local cache中吧。如果每個頁面都需要載入一些數量較少的資料,可以考慮把它們放在local cached。3)local cache缺少集體失效(group invalidation)的特性。在memcached叢集中,刪除或更新一個key會讓所有的觀察者覺察到。但是在local cache中, 我們只能通知所有的伺服器重新整理cache(很慢,不具擴充性)或者僅僅依賴緩衝逾時失效機制。10、memcached的cache機制是怎樣的。Memcached主要的cache機制是LRU(最近最少用)演算法+逾時失效。當您存資料到memcached中,可以指定該資料在緩衝中可以呆多久Which is forever, or some time in the future。如果memcached的記憶體不夠用了,到期的slabs會優先被替換,接著就輪到最老的未被使用的slabs。11、memcached如何?冗餘機制。不實現。Memcached應該是應用的緩衝層,從設計本身來京就不帶有任何冗餘機制。如果一個memcached節點失去了所有資料,應該可以從資料來源(比如資料庫)再次擷取到資料。應用系統應該可以容忍節點的失效。如果擔心節點失效會大大加重資料庫的負擔,那麼可以採取一些辦法。比如您可以 增加更多的節點 (來減少丟失一個節點的影響),熱備節點 (在其他節點down了的時候接管IP)等等。12、memcached如何處理容錯的。在節點失效的情況下,叢集沒有必要做任何容錯處理。如果發生了節點失效,應對的措施完全取決於使用者。節點失效時,下面列出幾種方案供您選擇:1)忽略它。 在失效節點被恢複或替換之前,還有很多其他節點可以應對節點失效帶來的影響。2)把失效的節點從節點列表中移除。做這個操作千萬要小心。在預設情況下(餘數式雜湊演算法),用戶端添加或移除節點,會導致所有的快取資料不可用。因為雜湊參照的節點列表變化了,大部分key會因為雜湊值的改變而被映射到(與原來)不同的節點上。3)啟動熱備節點,接管失效節點所佔用的IP。這樣可以防止雜湊紊亂(hashing chaos)。4)如果希望添加和移除節點,而不影響原先的雜湊結果,可以使用一致性雜湊演算法(consistent hashing)。5)兩次雜湊(reshing)。當用戶端存取資料時,如果發現一個節點down了,就再做一次雜湊(雜湊演算法與前一次不同),重新選擇另一個節點(需要注意的時,用戶端並沒有把down的節點從節點列表中移除,下次還是有可能先雜湊到它)。如果某個節點時好時壞,兩次雜湊的方法就有風險了,好的節點和壞的節點上都可能存在髒資料(stale data)。13、如何將memcached中item大量匯入匯出。不應該這樣做。Memcached是一個非阻塞的伺服器。任何可能導致memcached暫停或瞬時拒絕服務的操作都應該值得深思熟慮。向memcached中大量匯入資料往往不是您真正想要的。想象看,如果快取資料在匯出匯入之間發生了變化,您就需要處理髒資料了;如果快取資料在匯出匯入之間到期了,您又怎麼處理這些資料呢。因此,大量匯出匯入資料並不像想象中的那麼有用。不過在一個情境倒是很有用。如果您有大量的從不變化 的資料,並且希望緩衝很快熱(warm)起來,大量匯入快取資料是很有協助的。14、但是我確實需要把memcached中的item大量匯出匯入,怎麼辦。。    如果需要大量匯出和匯入,最可能的原因一般是重建快取資料需要消耗很長的時間或者資料庫壞了讓您飽受痛苦。    如果一個memcached節點down了讓您很痛苦,那麼必須對資料庫做一些最佳化工作。比如處理"驚群"問題( memcached節點都失效了,反覆的查詢讓資料庫不堪重負)或者存在最佳化不好的查詢等。Memcached 並不是逃避最佳化查詢的借口和方案。這裡給出一些提示:    使用MogileFS(或者CouchDB等類似的軟體)在儲存item,把item計算出來並dump到磁碟上。MogileFS可以很方便地覆寫item,並提供快速地訪問。甚至可以把MogileFS中的item    緩衝在memcached中,這樣可以加快讀取速度。 MogileFS+Memcached的組合可以加快緩衝不命中時的響應速度,提高網站的可用性。    重新使用MySQL。MySQL的 InnoDB主鍵查詢速度非常快。如果大部分快取資料都可以放到VARCHAR欄位中,那麼主鍵查詢的效能將更好。從memcached中按key查詢幾乎等價於MySQL的主鍵查詢:將key 雜湊到64-bit的整數,然後將資料存放區到MySQL中。您可以把原始(不做雜湊)的key儲存都普通的欄位中,然後建立二級索引來加快查詢...key被動地失效,大量刪除失效的key,等等。15、memcached是如何做身分識別驗證的。    沒有身份認證機制。memcached是運行在應用下層的軟體(身分識別驗證應該是應用上層的職責)。memcached的用戶端和伺服器端之所以是輕量級的,部分原因就是完全沒有實現身分識別驗證機制。這樣,memcached可以很快地建立新串連,伺服器端也無需任何配置。如果您希望限制訪問,您可以使用防火牆,或者讓memcached監聽unix domain socket。16、memcached的多線程是什麼。如何使用它們。    線程就是定律(threads rule)。在Steven Grimm和Facebook的努力下,memcached 1.2及更高版本擁有了多線程模式。多線程模式允許memcached能夠充分利用多個CPU,並在    CPU之間共用所有的快取資料。memcached使用一種簡單的鎖機制來保證資料更新操作的互斥。相比在同一個物理機器上運行多個memcached執行個體,這種方式能夠更有效地處理multi gets。如果系統的負載並不重,那麼不需要啟用多線程工作模式。如果您在運行一個擁有大規模硬體的、龐大的網站,將體驗到看到多線程的好處。更多資訊請參見:    簡單地總結一下:命令解析(memcached在這裡花了大部分時間)可以運行在多線程模式下。memcached內部對資料的操作是基於很多全域鎖的(因此這部分工作不是多線程的)。未來對多線程模式的改進,將移除大量的全域鎖,提高memcached在負載極高的情境下的效能。17. 在設計應用時,可以通過Memcached緩衝那些內容。1)緩衝簡單的查詢結果: 查詢快取儲存了給定查詢語句對應的整個結果集,最合適緩衝那些 經常被用到,但不會改變的 SQL 陳述式對查詢到的結果集,比如載入特定的過濾內容。$key = md5('SELECT * FROM rest_of_sql_statement_goes_here');if ($memcache->get($key)) {      ` return $memcache->get($key);`}else {    ` // Run the query and transform the result data into your final dataset form`    ` $result = $query_results_mangled_into_most_likely_an_array`     ` $memcache->set($key, $result, TRUE, 86400); // Store the result of the query for a day`    ` return $result;`}    記住,如果查詢語句對應的結果集改變,該結果集不會展現出來。這種方法不總是有用,但它確實讓工作變得比較快。    2)緩衝簡單的基於行的查詢結果: 基於行的緩衝會檢查快取資料key的列表,那些在緩衝中的行可以直接被取出,不在緩衝中的行將會從資料庫中取出並以唯一的鍵為標識緩衝起來,最後加入到最終的資料集中返回。隨著時間的推移,大多數資料都會被緩衝,這也意味著相比與資料庫,查詢語句會更多地從 memcached 中得到資料行。如果資料是相當靜態,我們可以設定一個較長的緩衝時間。    基於行的緩衝模式對下面這種搜尋情況特別有用 :資料集本身很大或是資料集是從多張表中得到,而資料集取決於查詢的輸入參數但是查詢的結果集之間的有重複部分。    比如,如果你有使用者A,B,C,D,E 的資料集。你去點擊一張顯示使用者A,B ,E資訊的頁面。首先,memcached得到3個不同的鍵,每個對應一個使用者去緩衝中尋找,全部未命中。然後就到資料庫中用 SQL查詢得到3個使用者的資料行,並緩衝他們。    現在,你又去點擊另一張顯示顯示C,D,E資訊的頁面。當你去尋找 memcached 時,C,D的資料並沒有被命中,但我們命中了 E 的資料。然後從資料庫得到 C,D 的行資料,緩衝在 memcached 中。至此以後,無論這些使用者資訊怎樣地排列組合,任何關於A,B,C,D,E資訊的頁面都可以從memcached得到資料了。3)緩衝的不只是 SQL 資料,可以緩衝最終完成的部分顯示頁面,以節省CPU計算時間    例如正在製作一張顯示使用者資訊的頁面,你可能得到一段關於使用者的資訊(姓名,生日,家庭住址,簡介),然後你可能會將 XML 格式的簡介資訊轉化為 HTML 格式或做其他的一些工作。相比單獨儲存這些屬性,你可能更願意 儲存經過渲染的資料區塊 。那時你就可以簡單地取出被預先處理後的 HTML 直接填充在頁面中,這樣節省了寶貴的 CPU 時間。18. 使用分層的緩衝    memcached 可以高速處理大量的快取資料,但是還是要根據系統的情況考慮維護多層的緩衝結構。例如除了memcached緩衝之外,還可以通過本機快取(如ehcache、oscache等)建立起多級緩衝。例如,可以採用本機快取緩衝一些基本資料,例如少量但訪問頻繁的資料(如產品分類,串連資訊,伺服器狀態變數,應用組態變數等),緩衝這些資料並讓他們儘可能的接近處理器是有意義的 , 這樣可以協助減少產生頁面的時間,並且在 memcached 失效的情況下可以增加可靠性。19. 當資料更新時需要更新緩衝    使用者編輯了自己的資訊,當儲存資訊到資料庫時,需要更新緩衝中的資料或是簡單地刪除老的資料。如果馬上更新資料,要防止從資料庫讀取那些剛剛更新過的資料。當使用者習慣性地重新載入自己的使用者資訊來確認是否修改成功時,資料將從緩衝中直接取出,這時他們獲得了最新的資料。memcache:1、memcached的優勢是什麼。1) 分布式 。2)相對應用伺服器的記憶體而言,可以進行單點訪問。3)效能強。2、不太適合採用Memcached緩衝的情況。1) 如果Value特別大,不太適合。預設編譯下Memcache只支援1M的Value。事實上由於存在序列化還原序列化的過程,所以從實踐的角度來說也不建議把非常大的資料儲存在Memcache中。Memcache適合面向輸出的內容緩衝,而不是面向處理的資料緩衝,也就是不太適合把大塊資料放進去拿出來 處理之後再放回去,而是適合拿出來就直接給輸出了或是拿出來不需要處理直接使用。2) 如果不允許到期,不太適合。Memcache在預設情況下最大30天到期,而且在記憶體達到使用限制後它也會回收最近最少使用的資料。3、清除部分快取資料的過程。    可採用命名空間(在Memcache的語境下可採用Key首碼的辦法代替,例如設定Key為“子系統名稱+實體名+實體的ID”)的辦法來實現,用以區分不同類型的緩衝內容,以便在需要的時候可以清除某一類緩衝。4、Value的組織問題。    主要涉及被緩衝的資料的顆粒度,比如要儲存一個資料表,是一行資料儲存在一個索引值還是統一儲存為一個索引值。如果資料儲存的粒度很小的話最好是在擷取的時候能夠批量擷取,在儲存的時候也能夠批量儲存,也就是說對於跨網路的調用次數越少越好。5、memcache中Key的約定和命名規範?    第一種:一般是項目名稱+字元常量(實體名或表名等)+返回PO的id(或者唯一標示都可以)。這種方法代碼一般會嵌入到Service中,從而破壞service的商務邏輯,耦合性較高。可以考慮在action層與service層中間加入一層,來降低耦合性。    第二種:可以用spring aop來攔截你要緩衝的service,唯一key可以通過類名+方法名+參數名等來組成;這種方法適用於分模組開發 ,因為調用的都是同一個類中的方法,但是攔截器也會在一定程度上影響效能。但是可以提高開發的效率,還有就是不會破壞service層的商務邏輯。    第三種:用sql語句+id(或者查詢條件)。這種方法不是很好。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.