1. 程式人生 > >Memcache與redis的區別?

Memcache與redis的區別?

Memcache與redis的區別?

資料結構:Memcache僅能支援簡單的K-V形式,Redis支援的資料更多

多執行緒:Memcache支援多執行緒,Redis支援單執行緒,CPU利用Memcache利用率更高

持久化:Redis支援持久化,Memcache不支援持久化

分散式:Redis做主從結構,而Memcache伺服器需要通過hash一致化來支撐主從結構

虛擬記憶體:Redis當實體記憶體使用完時,會將一些很久沒有用的記憶體交換到磁碟,而Memcache採取的LUR策略,將一部分資料重新整理掉

 

兩者進行對比,是因為都是記憶體資料管理系統,而實際上兩者之間區別還是很大,Redis更多的象一個鍵值對資料,包括資料的持久化,主從架構,資料備份等策略都是為了保證資料安全以及高可用,而Memcache更多的是一個數據快取系統是為了提升資料的讀取效率,所以兩者的應用也有所不同,Memcache適合用於快取SQL語句、資料集、使用者臨時性資料、延遲查詢資料和session等工作場合,Redis除去做Nosql資料庫使用外,還能用做訊息佇列,資料堆疊和資料快取等。

 

什麼是memcache?

Memcache是一個高效能,分散式於記憶體物件中的快取系統,通過在記憶體中快取一個巨大的hash表,他能夠儲存包括影象,檔案,sql語句結果等資料,可以理解為它是一個為提升讀取效率的資料容器,先將資料從資料庫提取到記憶體中,然後在記憶體中讀取,從而提升讀取效率

Memcache的特性

使用實體記憶體作為快取區,可獨立執行在伺服器上,每個程序最大記憶體為2G。如果想快取更多的資料,可以開闢更多的Memcache程序(不同埠)或者使用分散式Memcache進行快取。

使用K-V形式的方式來儲存資料,這是一種單索引的結構化資料組織形式,查詢的效率高,協議簡單:基於文字行的協議,直接通過telnet在Memcache伺服器上程序存取資料操作,簡單基於libevent高效能通訊

內建的記憶體管理方式:使用stab Allcation進行記憶體管理,按照既定的記憶體,將記憶體切割成特定的長度來儲存相應的資料

分散式:使用hash一致性演算法,進行分散式儲存資料,各個Memcache伺服器之間互不通訊,各自獨立存取資料,不共享任何資訊,伺服器並不具有分散式功能,分散式部署取決於memcache客戶端

快取策略:LRU到期失效策略,即在記憶體用完之後,伺服器端會根據LRU策略,計算最近沒有使用過的資料,將其進行替換

什麼是redis?

Redis 是一個開源的,記憶體中的資料結構儲存系統,它可以用作資料庫、快取和訊息中介軟體。 它支援多種型別的資料結構,如 字串,雜湊, 列表, 集合, 有序集合 與範圍查詢, 點陣圖,超日誌和 地理空間,索引半徑查詢。 Redis 內建了 複製(LUA指令碼, LRU驅動事件,事務和不同級別的 磁碟持久化 並通過 Redis哨兵和自動 分割槽提供高可用性

 

Redis的特性

Redis支援永久性操作,可以從記憶體永久化儲存在磁碟,下次重啟可以從磁碟中恢復資料

除去K-V形式之外,還支援list,set,zset,hash等多種資料結構

支援主從架構資料備份

 

Memcache支援的資料型別有什麼?

memcache支援簡單的資料型別,想要存入複雜的資料型別必須把複雜的資料型別轉變成簡單的資料型別。

 

 

 

Redis支援的資料型別有什麼?

redis支援的五大資料型別:

1.String(字串)

string型別是二進位制安全的。意思是redis的string可以包含任何資料。比如jpg圖片或者序列化的物件 。

string型別是Redis最基本的資料型別,一個redis中字串value最多可以是512M

 

2.Hash(雜湊)

Redis hash 是一個鍵值對集合。

Redis hash是一個string型別的field和value的對映表,hash特別適合用於儲存物件。

類似Java裡面的Map<String,Object>

 

3.List(列表)

Redis 列表是簡單的字串列表,按照插入順序排序。你可以新增一個元素導列表的頭部(左邊)或者尾部(右邊)。

它的底層實際是個連結串列

 

4.Set(集合)

Redis的Set是string型別的無序集合。它是通過HashTable實現的,

 

5.zset(sorted set:有序集合)

Redis zset 和 set 一樣也是string型別元素的集合,且不允許重複的成員。

不同的是每個元素都會關聯一個double型別的分數。

redis正是通過分數來為集合中的成員進行從小到大的排序。zset的成員是唯一的,但分數(score)卻可以重複。

 

memcache與memcached的區別?

1.由於專案需要這裡還是區分下Memcached與Memcache差別,謹防再步入坑中

2.目前大多數php環境裡使用的都是不帶d的memcache版本,這個版本出的比較早,是一個原生版本,完全在php框架內開發的。與之對應的帶d的memcached是建立在libmemcached的基礎上,所以相對來說,memcached版本的功能更全一些。 

 

2 . Memcache是原生實現的,支援OO和非OO兩套介面並存。而memcached是使用libmemcached,只支援OO介面。

3.memcached還有個非常稱讚的地方,就是flag不是在操作的時候設定了,而是有了一個統一的setOption()。Memcached實現了更多的memcached協議。

4.memcached支援Binary Protocol,而memcache不支援。這意味著memcached會有更高的效能。不過memcached目前還不支援長連線。

為什麼使用redis?

速度快,完全基於記憶體,使用C語言實現,網路層使用epoll解決高併發問題,單執行緒模型避免了不必要的上下文切換及競爭條件;

注意:單執行緒僅僅是說在網路請求這一模組上用一個執行緒處理客戶端的請求,像持久化它就會重開一個執行緒/程序去進行處理

豐富的資料型別,Redis有8種資料型別,當然常用的主要是 String、Hash、List、Set、 SortSet 這5種類型,他們都是基於鍵值的方式組織資料。每一種資料型別提供了非常豐富的操作命令,可以滿足絕大部分需求,如果有特殊需求還能自己通過 lua 指令碼自己建立新的命令(具備原子性);

除了提供的豐富的資料型別,Redis還提供了像慢查詢分析、效能測試、Pipeline、事務、Lua自定義命令、Bitmaps、HyperLogLog、釋出/訂閱、Geo等個性化功能。

Redis的程式碼開源在GitHub,程式碼非常簡單優雅,任何人都能夠吃透它的原始碼;它的編譯安裝也是非常的簡單,沒有任何的系統依賴;有非常活躍的社群,各種客戶端的語言支援也是非常完善。另外它還支援事務(沒用過)、持久化、主從複製讓高可用、分散式成為可能。

 

Redis 應用場景如何使用?

對於兩者的選擇還是要看具體的應用場景,如果需要快取的資料只是key-value這樣簡單的結構時,我在專案裡還是採用memcache,它也足夠的穩定可靠。如果涉及到儲存,排序等一系列複雜的操作時,毫無疑問選擇redis。