Redis和Mecahe的簡介
Memcache介紹
概念:Memcache是一個高效能,分散式記憶體物件快取系統,通過在記憶體裡維護一個統一的巨大的hash表,它能夠用來儲存各種格式的資料,包括影象、視訊、檔案以及資料庫檢索的結果等。簡單的說就是將資料呼叫到記憶體中,然後從記憶體中讀取,從而大大提高讀取速度。
Memcache特性:
1)使用實體記憶體作為快取區,可獨立執行在伺服器上。每個程序最大2G,如果想快取更多的資料,可以開闢更多的memcache程序(不同埠)或者使用分散式memcache進行快取,將資料快取到不同的物理機或者虛擬機器上。
2)使用key-value 的方式來儲存資料,這是一種單索引的結構化資料組織形式,可使資料項查詢時間複雜度為O(1)。
3)協議簡單:基於文字行的協議 ,直接通過telnet在memcached伺服器上可進行存取資料操作,簡單,方便多種快取參考此協議;
4)基於libevent高效能通訊:Libevent是一套利用C開發的程式庫,它將BSD系統的kqueue,Linux系統的epoll(Linux2.6核心) 等事件處理功能封裝成一個介面,與傳統的select相比,提高了效能。
5)內建的記憶體管理方式:所有資料都儲存在記憶體中,存取資料比硬碟快,當記憶體滿後,通過LRU演算法自動刪除不使用的快取,但沒有考慮資料的容災問題,重啟服務,所有資料會丟失。
6)分散式:各個memcached伺服器之間互不通訊,各自獨立存取資料,不共享任何資訊。伺服器並不具有分散式功能,分散式部署取決於memcache客戶端、
7)快取策略:Memcached的快取策略是LRU(最近最少使用)到期失效策略。在memcached記憶體儲資料項時,可以指定它在快取的失效時間,預設為永久。當memcached伺服器用完分配的內時,失效的資料被首先替換,然後也是最近未使用的資料。在LRU中,memcached使用的是一種Lazy Expiration策略,自己不會監控存入的key/vlue對是否過期,而是在獲取key值時檢視記錄的時間戳,檢查key/value對空間是否過期,這樣可減輕伺服器的負載。
Redis
Redis 介紹
Redis是一個開源(BSD許可)的,基於記憶體的,多資料結構儲存系統。可以用作資料庫、快取和訊息中介軟體。 支援多種型別的資料結構,如 字串(strings), 雜湊(hashes), 列表(lists),集合(sets), 有序集合(sorted sets) 與範圍查詢,bitmaps,hyperloglogs和 地理空間(geospatial) 索引半徑查詢,內建了 複製(replication),LUA指令碼(Lua scripting),LRU驅動事件(LRU eviction),事務(transactions) 和不同級別的 磁碟持久化(persistence), 並通過Redis哨兵(Sentinel)和自動分割槽(Cluster)提供高可用性(high availability)。
區別
簡單地比較Redis與Memcached的區別
- Redis不僅僅支援簡單的k/v型別的資料,同時還提供list,set,hash等資料結構的儲存。
- Redis支援資料的備份,即master-slave模式的資料備份。
- Redis支援資料的持久化,可以將記憶體中的資料保持在磁碟中,重啟的時候可以再次載入進行使用。
在Redis中,並不是所有的資料都一直儲存在記憶體中的。這是和Memcached相比一個最大的區別。Redis只會快取所有的key的資訊,如果Redis發現記憶體的使用量超過了某一個閥值,將觸發swap的操作,Redis根據“swappability = age*log(size_in_memory)”計算出哪些key對應的value需要swap到磁碟。然後再將這些key對應的value持久化到磁碟中,同時在記憶體中清除。這種特性使得Redis可以保持超過其機器本身記憶體大小的資料。當然,機器本身的記憶體必須要能夠保持所有的key,畢竟這些資料是不會進行swap操作的。同時由於Redis將記憶體中的資料swap到磁碟中的時候,提供服務的主執行緒和進行swap操作的子執行緒會共享這部分記憶體,所以如果更新需要swap的資料,Redis將阻塞這個操作,直到子執行緒完成swap操作後才可以進行修改。
當從Redis中讀取資料的時候,如果讀取的key對應的value不在記憶體中,那麼Redis就需要從swap檔案中載入相應資料,然後再返回給請求方。這裡就存在一個I/O執行緒池的問題。在預設的情況下,Redis會出現阻塞,即完成所有的swap檔案載入後才會相應。這種策略在客戶端的數量較小,進行批量操作的時候比較合適。但是如果將Redis應用在一個大型的網站應用程式中,這顯然是無法滿足大併發的情況的。所以Redis執行我們設定I/O執行緒池的大小,對需要從swap檔案中載入相應資料的讀取請求進行併發操作,減少阻塞的時間。
Redis 和Memcache各方面介紹區別
- 效能:TPS方面redis和memcache差不多,redis:單核,因此在大資料量的情況下,略遜色於Memcache, Memcache:多核,多執行緒,效能強勁,但是在資料量不大時,優勢不明顯
- 操作的便利性:memcache資料結構單一,redis豐富一些,資料操作方面,redis更好一些,較少的網路IO次數
- 記憶體空間的大小和資料量的大小:redis在2.0版本後增加了自己的VM特性,突破實體記憶體的限制;可以對key value設定過期時間(類似memcache)。memcache可以修改最大可用記憶體,採用LRU演算法
- 可用性(單點問題):對於單點問題,redis,依賴客戶端來實現分散式讀寫;主從複製時,每次從節點重新連線主節點都要依賴整個快照,無增量複製,因效能和效率問題,所以單點問題比較複雜;不支援自動sharding,需要依賴程式設定一致hash 機制。一種替代方案是,不用redis本身的複製機制,採用自己做主動複製(多份儲存),或者改成增量複製的方式(需要自己實現),一致性問題和效能的權衡。Memcache本身沒有資料冗餘機制, 也沒必要;對於故障預防,採用依賴成熟的hash或者環狀 的演算法,解決單點故障引起的抖動問題。
- 可靠性(持久化):對於資料持久化和資料恢復,redis支援(快照、AOF):依賴快照進行持久化,aof增強了可靠性的同時,對效能有所影響memcache不支援,通常用在做快取,提升效能;
- 資料一致性(事務支援):Memcache 在併發場景下,用cas保證一致性redis事務支援比較弱,只能保證事務中的每個操作連續執行
- 應用場景:redis:資料量較小的更效能操作和運算上,memcache:用於在動態系統中減少資料庫負載,提升效能;做快取,提高效能(適合讀多寫少,對於資料量比較大,可以採用sharding)