Redis和Mecahe的簡介

Memcache介紹

概念:Memcache是一個高性能,分佈式內存對象緩存系統,經過在內存裏維護一個統一的巨大的hash表,它可以用來存儲各類格式的數據,包括圖像、視頻、文件以及數據庫檢索的結果等。簡單的說就是將數據調用到內存中,而後從內存中讀取,從而大大提升讀取速度。redis

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的區別

 

  1. Redis不只僅支持簡單的k/v類型的數據,同時還提供list,set,hash等數據結構的存儲。
  2. Redis支持數據的備份,即master-slave模式的數據備份。
  3. 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操做後才能夠進行修改。app

當從Redis中讀取數據的時候,若是讀取的key對應的value不在內存中,那麼Redis就須要從swap文件中加載相應數據,而後再返回給請求方。這裏就存在一個I/O線程池的問題。在默認的狀況下,Redis會出現阻塞,即完成全部的swap文件加載後纔會相應。這種策略在客戶端的數量較小,進行批量操做的時候比較合適。可是若是將Redis應用在一個大型的網站應用程序中,這顯然是沒法知足大併發的狀況的。因此Redis運行咱們設置I/O線程池的大小,對須要從swap文件中加載相應數據的讀取請求進行併發操做,減小阻塞的時間。

Redis 和Memcache各方面介紹區別

  1. 性能:TPS方面redis和memcache差很少,redis:單核,所以在大數據量的狀況下,略遜色於Memcache, Memcache:多核,多線程,性能強勁,可是在數據量不大時,優點不明顯
  2. 操做的便利性:memcache數據結構單一,redis豐富一些,數據操做方面,redis更好一些,較少的網絡IO次數
  3. 內存空間的大小和數據量的大小:redis在2.0版本後增長了本身的VM特性,突破物理內存的限制;能夠對key value設置過時時間(相似memcache)。memcache能夠修改最大可用內存,採用LRU算法
  4. 可用性(單點問題):對於單點問題,redis,依賴客戶端來實現分佈式讀寫;主從複製時,每次從節點從新鏈接主節點都要依賴整個快照,無增量複製,因性能和效率問題,因此單點問題比較複雜;不支持自動sharding,須要依賴程序設定一致hash 機制。一種替代方案是,不用redis自己的複製機制,採用本身作主動複製(多份存儲),或者改爲增量複製的方式(須要本身實現),一致性問題和性能的權衡。Memcache自己沒有數據冗餘機制,也不必;對於故障預防,採用依賴成熟的hash或者環狀的算法,解決單點故障引發的抖動問題。
  5. 可靠性(持久化):對於數據持久化和數據恢復,redis支持(快照、AOF):依賴快照進行持久化,aof加強了可靠性的同時,對性能有所影響memcache不支持,一般用在作緩存,提高性能;
  6. 數據一致性(事務支持):Memcache 在併發場景下,用cas保證一致性redis事務支持比較弱,只能保證事務中的每一個操做連續執行
  7. 應用場景:  redis:數據量較小的更性能操做和運算上,memcache:用於在動態系統中減小數據庫負載,提高性能;作緩存,提升性能(適合讀多寫少,對於數據量比較大,能夠採用sharding)
相關文章
相關標籤/搜索