近來在準備面試,將看到的東西進行下總結。html
redis數據類型豐富,支持set liset等類型
memcache支持簡單數據類型,須要客戶端本身處理複雜對象java
redis支持數據落地持久化存儲
memcache不支持數據持久存儲面試
redis支持master-slave複製模式
memcache可使用一致性hash作分佈式redis
memcache是一個內存緩存,key的長度小於250字符,單個item存儲要小於1M,不適合虛擬機使用算法
redis使用的是單線程模型,保證了數據按順序提交。
memcache須要使用cas保證數據一致性。CAS(Check and
Set)是一個確保併發一致性的機制,屬於「樂觀鎖」範疇;原理很簡單:拿版本號,操做,對比版本號,若是一致就操做,不一致就放棄任何操做spring
redis單線程模型只能使用一個cpu,能夠開啓多個redis進程mongodb
MongoDB是一個基於分佈式文件存儲的數據庫。由C++語言編寫。MongoDB是一個介於關係數據庫和非關係數據庫之間的產品,是非關係數據庫當中功能最豐富,最像關係數據庫的。它支持的數據結構很是鬆散,是相似json的bson格式,所以能夠存儲比較複雜的數據類型。Mongo最大的特色是它支持的查詢語言很是強大,其語法有點相似於面向對象的查詢語言,幾乎能夠實現相似關係數據庫單表查詢的絕大部分功能,並且還支持對數據創建索引。數據庫
Redis的存儲格式是Key-Value模式,除了基本的string類型,redis還實現了hash,list,set,zset數據類型。json
註解:數組
BSON之名緣於JSON,含義爲Binary JSON(二進制JSON),是一種二進制形式的存儲格式,採用了相似於 C 語言結構體的名稱、對錶示方法,支持內嵌的文檔對象和數組對象,具備輕量性、可遍歷性、高效性的特色,能夠有效描述非結構化數據和結構化數據。
與JSON相比,BSON着眼於提升存儲和掃描效率。BSON文檔中的大型元素以長度字段爲前綴以便於掃描。在某些狀況下,因爲長度前綴和顯式數組索引的存在,BSON使用的空間會多於JSON。
Redis自己支持兩種持久化,RDB(快照)和AOF追加方式。RDB持久化是指在指定的時間間隔內將內存中的數據集快照寫入磁盤,實際操做過程是fork一個子進程,先將數據集寫入臨時文件,寫入成功後,再替換以前的文件,用二進制壓縮存儲。AOF持久化以日誌的形式記錄服務器所處理的每個寫、刪除操做,查詢操做不會記錄,以文本的方式記錄,能夠打開文件看到詳細的操做記錄。
mongodb在啓動時,專門初始化一個線程不斷循環(除非應用crash掉),用於在必定時間週期內來從defer隊列中獲取要持久化的數據並寫入到磁盤的journal(日誌)和mongofile(數據)處,固然由於它不是在用戶添加記錄時就寫到磁盤上,因此按mongodb開發者說,它不會形成性能上的損耗,由於看過代碼發現,當進行CUD操做時,記錄(Record類型)都被放入到defer隊列中以供延時批量(groupcommit)提交寫入。
mongodb在寫入時會創建一條日誌(journal),日誌中記載了這次寫入操做具體更改的磁盤地址和字節。所以,一旦服務器忽然停電,能夠在啓動時對日誌進行重放,從而從新執行那些停機前沒有刷新到磁盤的操做。數據文件默認每60s刷盤一次。數據文件存放到/data/db/journal目錄裏。
mongodb默認每隔100毫秒或者寫入數據達到若干兆字節後,便會將這些操做寫入到日誌。即mongodb不會在每次寫入的時候都寫入到日誌,而是會成批量的提交更改。所以,在默認設置狀況下,mongodb不會丟失超過100毫秒的數據。
Redis支持事物,比較弱,僅能保證事物中的操做按順序執行。MongoDB不支持事物,靠客戶端自身保證
MongoDb:適合大數據量存儲,依賴系統虛擬內存管理,採用鏡像文件存儲;內存佔有率比較高,官方建議獨立部署在64位系統(32位有最大2.5G文件限制,64位沒有改限制)
Redis2.0後增長虛擬內存特性,突破物理內存限制;數據能夠設置時效性,相似於memcache
MongoDB: 支持master-slave,replicaset(內部採用paxos選舉算法,自動故障恢復),auto sharding機制,對客戶端屏蔽了故障轉移和切分機制
Redis: 依賴客戶端來實現分佈式讀寫;主從複製時,每次從節點從新鏈接主節點都要依賴整個快照,無增量複製;不支持自動sharding,須要依賴程序設定一致hash機制
Redis:適用於對讀寫效率要求都很高,數據處理業務複雜和對安全性要求較高的系統(如新浪微博的計數和微博發佈部分系統,對數據安全性、讀寫要求都很高)。 MongoDB:主要解決海量數據的訪問效率問題。