分類  >  資料庫 >

Memcahce跟Redis比較

tags:    時間:2013-12-23 21:49:04
Memcahce和Redis比較

一、Memcache

1.     memecache 把數據全部存在內存之中,斷電後會掛掉,數據不能超過內存大小
redis有部份存在硬碟上,這樣能保證數據的持久性。

2.      Memcache使用了Slab Allocator的內存分配機制:按照預先規定的大小,將分配的內存分割成特定長度的塊,以完全解決內存碎片問題。

3.      memcache 存在內存中,分配的內存滿后,會按一定的規則刪除一些k/v數據,重啟后自然全部丟失。

4.      過期策略--memcache在set時就指定,例如set key1 0 0 8,即永不過期。Redis可以通過例如expire 設定。

5.      首先要說明的是Memcached支持最大的存儲對象為1M。它的內存分配比較特殊,但是這樣的分配方式其實也是基於性能考慮的,簡單的分配機制可以更容易回收再分配,節省對CPU的使用。大於1M需要拆分。

6.      memcached能接受的key的最大長度是,255字元。

7.     同一份數據同時發送了一個set命令和一個get命令,它們不會影響對方,但是get以後,處理期間可能先被其他Set了,後面的Set會覆蓋前面的,但是memcached 1.2.5以及更高版本,提供了gets和cas命令,它們可以解決上面的問題。如果您使用gets命令查詢某個key的item,memcached會 給您返回該item當前值的唯一標識。如果您覆寫了這個item並想把它寫回到memcached中,您可以通過cas命令把那個唯一標識一起發送給 memcached。如果該item存放在memcached中的唯一標識與您提供的一致,您的寫操作將會成功。如果另一個進程在這期間也修改了這個 item,那麼該item存放在memcached中的唯一標識將會改變,您的寫操作就會失敗。

8.     無身份驗證,認為身份驗證是更高層的問題。

9.     刪除Delete操作只是將該chunk置為刪除狀態,這樣在下次使用將優先利用這樣的chunk。

10.             Flush操作相當於將所有的item失效的一個動作。並不會改變memcache內存分配情況。

11.         memcache已經分配的內存不會再主動清理。

12.         memcache分配給某個slab的內存頁不能再分配給其他slab。

13.         flush_all不能重置memcache分配內存頁的格局,只是給所有的item置為過期。

14.         memcache最大存儲的item(key+value)大小限制為1M,這由page大小1M限制。

15.         由於memcache的分散式是客戶端程序通過hash演算法得到的key取模來實現,不同的語言可能會採用不同的hash演算法,同樣的客戶端程序也有可能使用相異的方法,因此在多語言、多模塊共用同一組memcached服務時,一定要注意在客戶端選擇相同的hash演算法。

16.         啟動memcached時可以通過-M參數禁止LRU替換,在內存用盡時add和set會返回失敗。

17.         memcached啟動時指定的是數據存儲量,沒有包括本身佔用的內存、以及為了保存數據而設置的管理空間。因此它佔用的內存量會多於啟動時指定的內存分配量,這點需要注意。

 

二、Redis

1.      Redis不僅僅支持簡單的k/v類型的數據,同時還提供list,set,hash等數據結構的存儲。

2.  Redis支持數據的備份,即master-slave模式的數據備份。

3.  Redis支持數據的持久化,可以將內存中的數據保持在磁碟中,重啟的時候可以再次載入進行使用。

4.  Redis,具備一定的資料庫特徵。

5.  Redis數據可以存儲到硬碟,基本沒有過期策略。

6.  redis有一個致命缺陷 當內存滿了時 dump數據cpu佔用100%。

7.   

三、Memcache和Redis區別

  1. Redis中,並不是所有的數據都一直存儲在內存中的,這是和Memcached相比一個最大的區別。
  2. Redis在很多方面具備資料庫的特徵,或者說就是一個資料庫系統,而Memcached只是簡單的K/V緩存。
  3. 他們的擴展都需要做集群;實現方式:master-slave、Hash。
  4. 在100k以上的數據中,Memcached性能要高於Redis。
  5. 如果要說內存使用效率,使用簡單的key-value存儲的話,Memcached的內存利用率更高,而如果Redis採用hash結構來做key-value存儲,由於其組合式的壓縮,其內存利用率會高於Memcached。當然,這和你的應用場景和數據特性有關。
  6. 如果你對數據持久化和數據同步有所要求,那麼推薦你選擇Redis,因為這兩個特性Memcached都不具備。即使你只是希望在升級或者重啟系統后緩存數據不會丟失,選擇Redis也是明智的。
  7. Redis和Memcache在寫入性能上面差別不大,讀取性能上面尤其是批量讀取性能上面Memcache更強。

推薦閱讀文章

Bookmark the permalink ,來源:互聯網