mongodb、memcache和redis的簡單比較

前言

本文大部分是概括,並沒有太多我的思路redis

mongodb、memcache和redis的簡單比較

redis、memcahce 比較類似,但與 mongodb 徹底不一樣,幾乎沒有可比性。算法

總的來講 redis/memcache 是基於內存的,講究的是性能,多用做緩存層,好比說存放session。而 mongodb 是面向文檔的,存儲的是相似JSON的非結構化數據,查詢起來很是方便,開發效率高,比較相似傳統SQL關係型數據庫。sql

從如下幾個維度,對redis、memcache、mongoDB 作了對比:mongodb

  1. 體積

Redis是一個基於內存的鍵值數據庫,它由C語言實現的,以單線程異步的方式工做,與Nginx/ NodeJS工做原理近似。因此文件很是小。編繹出來的主文件還不到 2Mb,在 Linux 服務器上初始只須要佔用1Mb左右的內存。數據庫

Mongodb安裝包則要大的多,跟mySQL差很少,都是百兆級的。緩存

  1. 性能

都比較高,性能對咱們來講應該都不是瓶頸bash

整體來說,TPS方面redis和memcache差很少,要大於mongodb服務器

  1. 操做的便利性

memcache數據結構單一網絡

redis豐富一些,數據操做方面,redis更好一些,較少的網絡IO次數session

mongodb支持豐富的數據表達,索引,最相似關係型數據庫,支持的查詢語言很是豐富

  1. 內存空間的大小和數據量的大小

redis在2.0版本後增長了本身的VM特性,突破物理內存的限制;能夠對key value設置過時時間(相似memcache)

memcache能夠修改最大可用內存,採用LRU算法

mongoDB適合大數據量的存儲,依賴操做系統VM作內存管理,吃內存也比較厲害,服務不要和別的服務在一塊兒

  1. 可用性(單點問題)

對於單點問題,

redis,依賴客戶端來實現分佈式讀寫;主從複製時,每次從節點從新鏈接主節點都要依賴整個快照,無增量複製,因性能和效率問題,

因此單點問題比較複雜;不支持自動sharding,須要依賴程序設定一致hash 機制。

一種替代方案是,不用redis自己的複製機制,採用本身作主動複製(多份存儲),或者改爲增量複製的方式(須要本身實現),一致性問題和性能的權衡

Memcache自己沒有數據冗餘機制,也不必;對於故障預防,採用依賴成熟的hash或者環狀的算法,解決單點故障引發的抖動問題。

mongoDB支持master-slave,replicaset(內部採用paxos選舉算法,自動故障恢復),auto sharding機制,對客戶端屏蔽了故障轉移和切分機制。

  1. 可靠性(持久化)

對於數據持久化和數據恢復,

redis支持(快照、AOF):依賴快照進行持久化,aof加強了可靠性的同時,對性能有所影響

memcache不支持,一般用在作緩存,提高性能;

MongoDB從1.8版本開始採用binlog方式支持持久化的可靠性,備份還原方法

7.數據一致性(事務支持)

Memcache 在併發場景下,用cas保證一致性

redis事務支持比較弱,只能保證事務中的每一個操做連續執行

mongoDB不支持事務

8.數據分析

mongoDB內置了數據分析的功能(mapreduce),其餘不支持

9.應用場景

redis:數據量較小的更性能操做和運算上

memcache:用於在動態系統中減小數據庫負載,提高性能;作緩存,提升性能(適合讀多寫少,對於數據量比較大,能夠採用sharding)

MongoDB:主要解決海量數據的訪問效率問題

MongoDB vs MySQL

術語和概念

MongoDB不少概念和MySQL相似

MySQL    MongoDB  
Table    Collection  
Row      Document  
Column   Field  
Joins    Embedded documents, linking 
複製代碼

特性比較

像MySQL同樣,MongoDB也提供豐富的特性,也有本身的查詢語言,高可用的二級索引(包括文本搜索和地理位置),強大,高聚合數據分析框架,比關係型數據庫有着更加豐富的數據類型和可擴展性

MySQL          MongoDB
Rich Data Model        No             Yes  
Dyamic Schema          No             Yes  
Typed Data             Yes            Yes  
Data Locality          No             Yes  
Field Updates          Yes            Yes  
Easy for Programmers   No             Yes  
Complex Transactions   Yes            No  
Auditing               Yes            Yes  
Auto-Sharding          No             Yes
複製代碼

查詢操做

# sql
# 查詢
select * form table where condition
# 更新
update table set field1='somevalue',field2='somevalue' where id=1
# 插入
insert into table (field1,field2) values ("sv","sv")
# mongodb
# 查詢
db.conections.find({}) or {username:'test'}
# 更新
db.connections.update({查詢條件},{$set:{值}},multi:true)
# 插入
# new 或 save
db.users.insert({  
    user_id: "bcd001", 
    age: 45, 
    status: "A"
})

複製代碼
相關文章
相關標籤/搜索