天天看點

Nosql介紹及Redis,Memchche,MongoDb的差別Nosql介紹Nosql和關系型資料庫的差別Redis,Memcache,MongoDb的特點與差別

一、Nosql介紹

Nosql介紹

Nosql的全稱是Not Only Sql,這個概念早起就有人提出,在09年的時候比較火。Nosql指的是非關系型資料庫,而我們常用的都是關系型資料庫。就像我們常用的mysql,sqlserver一樣,這些資料庫一般用來存儲重要資訊,應對普通的業務是沒有問題的。但是,随着網際網路的高速發展,傳統的關系型資料庫在應付超大規模,超大流量以及高并發的時候力不從心。而就在這個時候,Nosql得到的告訴的發展。

Nosql和關系型資料庫的差別

1.存儲方式

  關系型資料庫是表格式的,是以存儲在表的行和列中。他們之間很容易關聯協作存儲,提取資料很友善。而Nosql資料庫則與其相反,他是大塊的組合在一起。通常存儲在資料集中,就像文檔、鍵值對或者圖結構。

2.存儲結構

  關系型資料庫對應的是結構化資料,資料表都預先定義了結構(列的定義),結構描述了資料的形式和内容。這一點對資料模組化至關重要,雖然預定義結構帶來了可靠性和穩定性,但是修改這些資料比較困難。而Nosql資料庫基于動态結構,使用與非結構化資料。因為Nosql資料庫是動态結構,可以很容易适應資料類型和結構的變化。

3.存儲規範

  關系型資料庫的資料存儲為了更高的規範性,把資料分割為最小的關系表以避免重複,獲得精簡的空間利用。雖然管理起來很清晰,但是單個操作設計到多張表的時候,資料管理就顯得有點麻煩。而Nosql資料存儲在平面資料集中,資料經常可能會重複。單個資料庫很少被分隔開,而是存儲成了一個整體,這樣整塊資料更加便于讀寫

4.存儲擴充

  這可能是兩者之間最大的差別,關系型資料庫是縱向擴充,也就是說想要提高處理能力,要使用速度更快的計算機。因為資料存儲在關系表中,操作的性能瓶頸可能涉及到多個表,需要通過提升計算機性能來克服。雖然有很大的擴充空間,但是最終會達到縱向擴充的上限。而Nosql資料庫是橫向擴充的,它的存儲天然就是分布式的,可以通過給資源池添加更多的普通資料庫伺服器來分擔負載。

5.查詢方式

  關系型資料庫通過結構化查詢語言來操作資料庫(就是我們通常說的SQL)。SQL支援資料庫CURD操作的功能非常強大,是業界的标準用法。而Nosql查詢以塊為單元操作資料,使用的是非結構化查詢語言(UnQl),它是沒有标準的。關系型資料庫表中主鍵的概念對應Nosql中存儲文檔的ID。關系型資料庫使用預定義優化方式(比如索引)來加快查詢操作,而Nosql更簡單更精确的資料通路模式。

6.事務

  關系型資料庫遵循ACID規則(原子性(Atomicity)、一緻性(Consistency)、隔離性(Isolation)、持久性(Durability)),而Nosql資料庫遵循BASE原則(基本可用(Basically Availble)、軟/柔性事務(Soft-state )、最終一緻性(Eventual Consistency))。由于關系型資料庫的資料強一緻性,是以對事務的支援很好。關系型資料庫支援對事務原子性細粒度控制,并且易于復原事務。而Nosql資料庫是在CAP(一緻性、可用性、分區容忍度)中任選兩項,因為基于節點的分布式系統中,很難全部滿足,是以對事務的支援不是很好,雖然也可以使用事務,但是并不是Nosql的閃光點。

7.性能

  關系型資料庫為了維護資料的一緻性付出了巨大的代價,讀寫性能比較差。在面對高并發讀寫性能非常差,面對海量資料的時候效率非常低。而Nosql存儲的格式都是key-value類型的,并且存儲在記憶體中,非常容易存儲,而且對于資料的 一緻性是 弱要求。Nosql無需sql的解析,提高了讀寫性能。

8.授權方式

  關系型資料庫通常有SQL Server,Mysql,Oracle。主流的Nosql資料庫有redis,memcache,MongoDb。大多數的關系型資料庫都是付費的并且價格昂貴,成本較大,而Nosql資料庫通常都是開源的。

Redis,Memcache,MongoDb的特點與差別

Redis

優點

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

2.支援持久化操作,可以進行aof及rdb資料持久化到磁盤,進而進行資料備份或資料恢複等操作,較好的防止資料丢失  的手段。

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

4.單線程請求,所有指令串行執行,并發情況下不需要考慮資料一緻性問題。

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

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

缺點

1.Redis隻能使用單線程,性能受限于CPU性能,故單執行個體CPU最高才可能達到5-6wQPS每秒(取決于資料結構,資料大小以及伺服器硬體性能,日常環境中QPS高峰大約在1-2w左右)。

2.支援簡單的事務需求,但業界使用場景很少,并不成熟,既是優點也是缺點。

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

Memcache

優點

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

2.支援直接配置為session handle。

缺點

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

2.無法進行持久化,資料不能備份,隻能用于緩存使用,且重新開機後資料全部丢失。

3.無法進行資料同步,不能将MC中的資料遷移到其他MC執行個體中。

4.Memcached記憶體配置設定采用Slab Allocation機制管理記憶體,value大小分布差異較大時會造成記憶體使用率降低,并引發低使用率時依然出現踢出等問題。需要使用者注重value設計。

MongoDB

優點

1.更高的寫負載,MongoDB擁有更高的插入速度。

2.處理很大的規模的單表,當資料表太大的時候可以很容易的分割表。

3.高可用性,設定M-S不僅友善而且很快,MongoDB還可以快速、安全及自動化的實作節點(資料中心)故障轉移。

4.快速的查詢,MongoDB支援二維空間索引,比如管道,是以可以快速及精确的從指定位置擷取資料。MongoDB在啟動後會将資料庫中的資料以檔案映射的方式加載到記憶體中。如果記憶體資源相當豐富的話,這将極大地提高資料庫的查詢速度。

5.非結構化資料的爆發增長,增加列在有些情況下可能鎖定整個資料庫,或者增加負載進而導緻性能下降,由于MongoDB的弱資料結構模式,添加1個新字段不會對舊表格有任何影響,整個過程會非常快速。

缺點

1.不支援事務。

2.MongoDB占用空間過大 。

3.MongoDB沒有成熟的維護工具。

Redis、Memcache和MongoDB的差別

1.性能

三者的性能都比較高,總的來講:Memcache和Redis差不多,要高于MongoDB。

2.便利性

memcache資料結構單一。

redis豐富一些,資料操作方面,redis更好一些,較少的網絡IO次數。

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

3,存儲空間

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

memcache可以修改最大可用記憶體,采用LRU算法。

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

4.可用性

redis,依賴用戶端來實作分布式讀寫;主從複制時,每次從節點重新連接配接主節點都要依賴整個快照,無增量複制,因性能和效率問題,是以單點問題比較複雜;不支援自動sharding,需要依賴程式設定一緻hash 機制。一種替代方案是,不用redis本身的複制機制,采用自己做主動複制(多份存儲),或者改成增量複制的方式(需要自己實作),一緻性問題和性能的權衡。

Memcache本身沒有資料備援機制,也沒必要;對于故障預防,采用依賴成熟的hash或者環狀的算法,解決單點故障引起的抖動問題。

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

5.可靠性

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

memcache不支援,通常用在做緩存,提升性能。

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

6.一緻性

Memcache 在并發場景下,用cas保證一緻性。

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

mongoDB不支援事務。

7.資料分析

mongoDB内置了資料分析的功能(mapreduce),其他兩者不支援。

8.應用場景

redis:資料量較小的更性能操作和運算上。

memcache:用于在動态系統中減少資料庫負載,提升性能;做緩存,提高性能(适合讀多寫少,對于資料量比較大,可以采用sharding)。

MongoDB:主要解決海量資料的通路效率問題。

繼續閱讀