歡迎您光臨本站 註冊首頁

· mongodb redis雜誌閱讀

Redis、MongoDB 及 MemCache 的區別

admin @ 2020-04-18 reply:0

 1 基本概念

1.1 Redis(記憶體資料庫)

Redis是一個key-value儲存系統(布式內快取,高效能的key-value資料庫)。和Memcached類似,它支援儲存的value型別相對更多,包括string(字元串)、list(連結串列)、set(集合)、zset(sorted set --有序集合)和hash(雜湊型別)。這些資料型別都支援push/pop、add/remove及取交集並集和差集及更豐富的操作,而且這些操作都是原子性的。在此基礎上,redis支援各種不同方式的排序。與memcached一樣,為了保證效率,資料都是快取在記憶體中。區別的是redis會週期性的把更新的資料寫入磁碟或者把修改操作寫入追加的記錄檔案,並且在此基礎上實現了master-slave(主從)同步。

1.2 MongoDB(NoSQL資料庫)

MongoDB是一個介於關係資料庫和非關係資料庫之間的產品(基於分散式檔案儲存的資料庫),是非關係資料庫當中功能最豐富,最像關係資料庫的。他支援的資料結構非常鬆散,是類似json的bson格式,因此可以儲存比較複雜的資料型別。Mongo最大的特點是他支援的查詢語言非常強大,其語法有點類似於面向物件的查詢語言,幾乎可以實現類似關係資料庫單表查詢的絕大部分功能,而且還支援對資料建立索引。

1.3 Memcached(記憶體Cache)

Memcached是一個高效能的分散式記憶體物件快取系統,用於動態Web應用以減輕資料庫負載。它通過在記憶體中快取資料和物件來減少讀取資料庫的次數,從而提高動態、資料庫驅動網站的速度。Memcached基於一個儲存鍵/值對的hashmap。其守護程序(daemon )是用C寫的,但是客戶端可以用任何語言來編寫,並通過memcached協議與守護程序通訊。

2 特點

2.1 Redis

支援多種資料結構,如 string(字元串)、list(雙向連結串列)、dict(hash表)、set(集合)、zset(排序set)、hyperloglog(基數估算)。

支援持久化操作,可以進行aof及rdb資料持久化到磁碟,從而進行資料備份或資料恢復等操作,較好的防止資料丟失的手段。

支援通過Replication進行資料複製,通過master-slave機制,可以實時進行資料的同步複製,支援多級複製和增量複製,master-slave機制是Redis進行HA的重要手段。

單執行緒請求,所有命令串列執行,併發情況下不需要考慮資料一致性問題。

支援pub/sub訊息訂閱機制,可以用來進行訊息訂閱與通知。

支援簡單的事務需求,但業界使用場景很少,並不成熟。

Redis 只能使用單執行緒,效能受限於CPU效能,故單例項CPU最高才可能達到5-6w QPS(取決於資料結構,資料大小以及伺服器硬體效能,日常環境中QPS高峰大約在1-2w左右)。

依賴快照進行持久化,AOF增強了可靠性的同時,對效能有所影響。

Redis在string型別上會消耗較多記憶體,可以使用dict(hash表)壓縮儲存以降低記憶體耗用。

Memcached和Redis都是Key-Value型別,不適合在不同資料集之間建立關係,也不適合進行查詢搜尋。比如redis的keys pattern這種匹配操作,對redis的效能是災難;

Redis在2.0版本後增加了自己的VM特性,突破實體記憶體的限制;可以對key value設定過期時間(類似memcache);

Redis事務支援比較弱,只能保證事務中的每個操作連續執行。

2.2 MongoDB

適合大資料量的儲存,依賴作業系統VM做記憶體管理,吃記憶體也比較厲害,服務不要和別的服務在一起。

支援豐富的資料表達,索引,最類似關係型資料庫,支援的查詢語言非常豐富。

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

從1.8版本開始採用binlog方式支援持久化的可靠性。

MongoDB不支援事務。

MongoDB內建了資料分析的功能(mapreduce),其他不支援。

2.3 Memcached

可以利用多核優勢,單例項吞吐量極高,可以達到幾十萬QPS(取決於key、value的位元組大小以及伺服器硬體效能,日常環境中QPS高峰大約在4-6w左右)。適用於最大程度扛量。

支援直接配置為session handle。

只支援簡單的key/value資料結構,不像Redis可以支援豐富的資料型別。

無法進行持久化,資料不能備份,只能用於快取使用,且重啟後資料全部丟失。

無法進行資料同步,不能將MC中的資料遷移到其他MC例項中。

記憶體分配採用Slab Allocation機制管理記憶體,value大小分佈差異較大時會造成記憶體利用率降低,並引發低利用率時依然出現踢出等問題。需要使用者注重value設計。

Memcached可以修改最大可用記憶體,採用LRU演演算法。

3 應用場景

3.1 Redis

適用於對讀寫效率要求都很高,資料處理業務複雜和對安全性要求較高的系統(如新浪微博的計數和微博發布部分系統,對資料安全性、讀寫要求都很高)。

3.2 MongoDB

主要解決海量資料的訪問效率問題。

3.3 Memcached

動態系統中減輕資料庫負載,提升效能;做快取,適合多讀少寫,大資料量的情況(如人人網大量查詢使用者資訊、好友資訊、文章資訊等);

用於在動態系統中減少資料庫負載,提升效能;做快取,提高效能(適合讀多寫少,對於資料量比較大,可以採用sharding)。

[admin via ] Redis、MongoDB 及 MemCache 的區別已經有394次圍觀

http://coctec.com/magazine/show-post-item-74.html