概念:Memcache是一個高性能,分佈式內存對象緩存系統,經過在內存裏維護一個統一的巨大的hash表,它可以用來存儲各類格式的數據,包括圖像、視頻、文件以及數據庫檢索的結果等。簡單的說就是將數據調用到內存中,而後從內存中讀取,從而大大提升讀取速度。redis
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是一個開源(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只會緩存全部的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文件中加載相應數據的讀取請求進行併發操做,減小阻塞的時間。