"


"


程序員修神之路--用NOSql給高併發系統加速(繼續送書)


領取福利

記得長按,領取技術書籍哦

隨著互聯網大潮的到來,越來越多網站,應用系統需要海量數據的支撐,高併發、低延遲、高可用、高擴展等要求在傳統的關係型數據庫中已經得不到滿足,或者說關係型數據庫應對這些需求已經顯得力不從心了。關係型數據庫經過幾十年的發展已經很成熟,強大的sql語句支持,完美的ACID屬性的支持,使得關係型數據庫廣泛應用於各種各樣的應用系統中,但是應用的場景廣泛並非意味著完美。

- 由於關係型數據庫是按行進行存儲的,在某些只統計一列的需求場景下,也需要把整行讀入內存,導致了一個小小的統計需求高IO的缺點

- 關係型數據庫無法存儲數據結構,比如:一個商品可以從屬於多個分類,業務上的從屬關係體現到存儲上是一個列表而已,但是關係型數據庫需要把這些關係存儲為多行,無法直接存儲為一個列表。

- 關係型數據庫中的存儲單位表的架構是強約束,操作不存在的列會報出異常,而且添加、更新、刪除列必須執行DDL語句,如果表的現存數據量比較大,會出現長時間鎖表的現象。

- 關係型數據庫全文搜索功能普通比較弱,用like去匹配關鍵詞的時候,數據量比較大的情況下會出現慢查詢的現象。

- 關係型數據庫基於表格的關係模型使得很難添加新的或不同種類的關聯信息。

由於以上這些諸多問題,便誕生了以“NOSQL”為口號的很多解決方案。在某些關係型數據庫不擅長的領域,Nosql表現的很出色。上天是公平的,給你打開了一扇窗戶,必會給你關上半扇門,NoSql是以犧牲ACID某個或者某些特性為代價的。

NoSQL並不是銀彈,更多的時候是關係型數據庫一個有力補充,或者是特定場景下優於關係型數據庫的一種解決方案

"


程序員修神之路--用NOSql給高併發系統加速(繼續送書)


領取福利

記得長按,領取技術書籍哦

隨著互聯網大潮的到來,越來越多網站,應用系統需要海量數據的支撐,高併發、低延遲、高可用、高擴展等要求在傳統的關係型數據庫中已經得不到滿足,或者說關係型數據庫應對這些需求已經顯得力不從心了。關係型數據庫經過幾十年的發展已經很成熟,強大的sql語句支持,完美的ACID屬性的支持,使得關係型數據庫廣泛應用於各種各樣的應用系統中,但是應用的場景廣泛並非意味著完美。

- 由於關係型數據庫是按行進行存儲的,在某些只統計一列的需求場景下,也需要把整行讀入內存,導致了一個小小的統計需求高IO的缺點

- 關係型數據庫無法存儲數據結構,比如:一個商品可以從屬於多個分類,業務上的從屬關係體現到存儲上是一個列表而已,但是關係型數據庫需要把這些關係存儲為多行,無法直接存儲為一個列表。

- 關係型數據庫中的存儲單位表的架構是強約束,操作不存在的列會報出異常,而且添加、更新、刪除列必須執行DDL語句,如果表的現存數據量比較大,會出現長時間鎖表的現象。

- 關係型數據庫全文搜索功能普通比較弱,用like去匹配關鍵詞的時候,數據量比較大的情況下會出現慢查詢的現象。

- 關係型數據庫基於表格的關係模型使得很難添加新的或不同種類的關聯信息。

由於以上這些諸多問題,便誕生了以“NOSQL”為口號的很多解決方案。在某些關係型數據庫不擅長的領域,Nosql表現的很出色。上天是公平的,給你打開了一扇窗戶,必會給你關上半扇門,NoSql是以犧牲ACID某個或者某些特性為代價的。

NoSQL並不是銀彈,更多的時候是關係型數據庫一個有力補充,或者是特定場景下優於關係型數據庫的一種解決方案

程序員修神之路--用NOSql給高併發系統加速(繼續送書)

NoSQL

NoSQL,泛指非關係型的數據庫。現在大家更喜歡翻譯成:not only sql

"


程序員修神之路--用NOSql給高併發系統加速(繼續送書)


領取福利

記得長按,領取技術書籍哦

隨著互聯網大潮的到來,越來越多網站,應用系統需要海量數據的支撐,高併發、低延遲、高可用、高擴展等要求在傳統的關係型數據庫中已經得不到滿足,或者說關係型數據庫應對這些需求已經顯得力不從心了。關係型數據庫經過幾十年的發展已經很成熟,強大的sql語句支持,完美的ACID屬性的支持,使得關係型數據庫廣泛應用於各種各樣的應用系統中,但是應用的場景廣泛並非意味著完美。

- 由於關係型數據庫是按行進行存儲的,在某些只統計一列的需求場景下,也需要把整行讀入內存,導致了一個小小的統計需求高IO的缺點

- 關係型數據庫無法存儲數據結構,比如:一個商品可以從屬於多個分類,業務上的從屬關係體現到存儲上是一個列表而已,但是關係型數據庫需要把這些關係存儲為多行,無法直接存儲為一個列表。

- 關係型數據庫中的存儲單位表的架構是強約束,操作不存在的列會報出異常,而且添加、更新、刪除列必須執行DDL語句,如果表的現存數據量比較大,會出現長時間鎖表的現象。

- 關係型數據庫全文搜索功能普通比較弱,用like去匹配關鍵詞的時候,數據量比較大的情況下會出現慢查詢的現象。

- 關係型數據庫基於表格的關係模型使得很難添加新的或不同種類的關聯信息。

由於以上這些諸多問題,便誕生了以“NOSQL”為口號的很多解決方案。在某些關係型數據庫不擅長的領域,Nosql表現的很出色。上天是公平的,給你打開了一扇窗戶,必會給你關上半扇門,NoSql是以犧牲ACID某個或者某些特性為代價的。

NoSQL並不是銀彈,更多的時候是關係型數據庫一個有力補充,或者是特定場景下優於關係型數據庫的一種解決方案

程序員修神之路--用NOSql給高併發系統加速(繼續送書)

NoSQL

NoSQL,泛指非關係型的數據庫。現在大家更喜歡翻譯成:not only sql

程序員修神之路--用NOSql給高併發系統加速(繼續送書)

根據NoSQL的存儲等特性,大體可以分為以下幾類

- 鍵值(Key-Value)存儲數據庫。相關的產品:Redis、Riak、SimpleDB、Chordless、Scalaris、Memcached。主要解決關係數據庫無法存儲數據結構的問題。

- 列存儲數據庫。相關產品:BigTable、HBase、Cassandra、HadoopDB、GreenPlum、PNUTS。解決關係數據庫大數據場景下的 I/O 問題

- 文檔數據庫。相關產品:MongoDB、CouchDB、ThruDB、CloudKit、Perservere、Jackrabbit。解決關係數據庫強 schema 約束的問題。

- 圖形數據庫。相關產品:Neo4J、OrientDB、InfoGrid、GraphDB。主要解決大量複雜、互連接、低結構化的圖結構場合,如社交網絡、推薦系統等

- 全文搜索引擎。相關產品:Elasticsearch。主要解決關係數據庫的全文搜索性能問題。

由此可見,沒有哪一種NoSql是完美的,每一種Nosql都有自己擅長的領域,這也是我們做系統架構中要考慮的重要因素。

場景1

電商的商品設計過程中,每種商品的屬性都不同,屬性數目不同,屬性名不同,同一個商品有可能會屬於多個分類,而且隨著業務的發展,很多商品會增加新的屬性,而且最令程序員頭疼莫過於每種屬性都有可能有搜索的可能性(當然搜索可以利用搜索引擎來實現)。遇到這樣的需求場景,如果利用關係型數據庫來存儲的話,表的字段會非常多,而且字段的定義非常令人頭疼。

這樣的場景非常適合NOsql中的文檔型數據庫,比如MongoDB。文檔型數據庫新增字段非常簡單,不像關係型數據庫需要先執行DDL來增加字段,直接可以利用程序來進行讀寫,歷史數據就算是沒有相應的字段也不會有異常的情況發生。最重要的一點,文檔型數據庫很擅長存儲複雜結構的數據,一般情況下業務上可以利用表現能力很強的json數據結構。

{
"Id":1,
"ProductName":"杜蕾斯加強版",
"Price":100,
"Type":[
1,
2,
4
],
"Length":20,
"Height":2
}

如果所有商品信息都用mongodb來存儲的話,有的場景並不是十分完美。比如商品被成功購買之後扣庫存的問題,聯合查詢的問題,由於Nosql天生對ACID支持不足的原因,一個事務性的操作很難在Nosql中實現,所以設計系統的時候在很多情況下是關係數據庫+Nosql 來共同實現業務。

場景2

很多具體的業務中都有記錄數據然後進行統計的需求場景,比如那些統計uv,pv的系統。日誌型的數據量非常大,而且還有可能有峰值的出現,如果用關係型數據庫來存儲,很有可能在IO上會出現瓶頸,而且有可能會影響其他正常的業務,更不幸的是當執行統計語句的時候,性能更是差強人意。這樣的日誌型統計業務很適合HBase這樣的列式Nosql,業務上要統計一天的uv,pv數據,HBase很適合統計某一列數據的場景,因為只需要把對應的列進行統計即可,不像關係型數據庫那樣需要把所有行都加載進內存,而且列式存儲一般比行式存儲擁有更大的壓縮比例,佔用的磁盤空間會更少。

"


程序員修神之路--用NOSql給高併發系統加速(繼續送書)


領取福利

記得長按,領取技術書籍哦

隨著互聯網大潮的到來,越來越多網站,應用系統需要海量數據的支撐,高併發、低延遲、高可用、高擴展等要求在傳統的關係型數據庫中已經得不到滿足,或者說關係型數據庫應對這些需求已經顯得力不從心了。關係型數據庫經過幾十年的發展已經很成熟,強大的sql語句支持,完美的ACID屬性的支持,使得關係型數據庫廣泛應用於各種各樣的應用系統中,但是應用的場景廣泛並非意味著完美。

- 由於關係型數據庫是按行進行存儲的,在某些只統計一列的需求場景下,也需要把整行讀入內存,導致了一個小小的統計需求高IO的缺點

- 關係型數據庫無法存儲數據結構,比如:一個商品可以從屬於多個分類,業務上的從屬關係體現到存儲上是一個列表而已,但是關係型數據庫需要把這些關係存儲為多行,無法直接存儲為一個列表。

- 關係型數據庫中的存儲單位表的架構是強約束,操作不存在的列會報出異常,而且添加、更新、刪除列必須執行DDL語句,如果表的現存數據量比較大,會出現長時間鎖表的現象。

- 關係型數據庫全文搜索功能普通比較弱,用like去匹配關鍵詞的時候,數據量比較大的情況下會出現慢查詢的現象。

- 關係型數據庫基於表格的關係模型使得很難添加新的或不同種類的關聯信息。

由於以上這些諸多問題,便誕生了以“NOSQL”為口號的很多解決方案。在某些關係型數據庫不擅長的領域,Nosql表現的很出色。上天是公平的,給你打開了一扇窗戶,必會給你關上半扇門,NoSql是以犧牲ACID某個或者某些特性為代價的。

NoSQL並不是銀彈,更多的時候是關係型數據庫一個有力補充,或者是特定場景下優於關係型數據庫的一種解決方案

程序員修神之路--用NOSql給高併發系統加速(繼續送書)

NoSQL

NoSQL,泛指非關係型的數據庫。現在大家更喜歡翻譯成:not only sql

程序員修神之路--用NOSql給高併發系統加速(繼續送書)

根據NoSQL的存儲等特性,大體可以分為以下幾類

- 鍵值(Key-Value)存儲數據庫。相關的產品:Redis、Riak、SimpleDB、Chordless、Scalaris、Memcached。主要解決關係數據庫無法存儲數據結構的問題。

- 列存儲數據庫。相關產品:BigTable、HBase、Cassandra、HadoopDB、GreenPlum、PNUTS。解決關係數據庫大數據場景下的 I/O 問題

- 文檔數據庫。相關產品:MongoDB、CouchDB、ThruDB、CloudKit、Perservere、Jackrabbit。解決關係數據庫強 schema 約束的問題。

- 圖形數據庫。相關產品:Neo4J、OrientDB、InfoGrid、GraphDB。主要解決大量複雜、互連接、低結構化的圖結構場合,如社交網絡、推薦系統等

- 全文搜索引擎。相關產品:Elasticsearch。主要解決關係數據庫的全文搜索性能問題。

由此可見,沒有哪一種NoSql是完美的,每一種Nosql都有自己擅長的領域,這也是我們做系統架構中要考慮的重要因素。

場景1

電商的商品設計過程中,每種商品的屬性都不同,屬性數目不同,屬性名不同,同一個商品有可能會屬於多個分類,而且隨著業務的發展,很多商品會增加新的屬性,而且最令程序員頭疼莫過於每種屬性都有可能有搜索的可能性(當然搜索可以利用搜索引擎來實現)。遇到這樣的需求場景,如果利用關係型數據庫來存儲的話,表的字段會非常多,而且字段的定義非常令人頭疼。

這樣的場景非常適合NOsql中的文檔型數據庫,比如MongoDB。文檔型數據庫新增字段非常簡單,不像關係型數據庫需要先執行DDL來增加字段,直接可以利用程序來進行讀寫,歷史數據就算是沒有相應的字段也不會有異常的情況發生。最重要的一點,文檔型數據庫很擅長存儲複雜結構的數據,一般情況下業務上可以利用表現能力很強的json數據結構。

{
"Id":1,
"ProductName":"杜蕾斯加強版",
"Price":100,
"Type":[
1,
2,
4
],
"Length":20,
"Height":2
}

如果所有商品信息都用mongodb來存儲的話,有的場景並不是十分完美。比如商品被成功購買之後扣庫存的問題,聯合查詢的問題,由於Nosql天生對ACID支持不足的原因,一個事務性的操作很難在Nosql中實現,所以設計系統的時候在很多情況下是關係數據庫+Nosql 來共同實現業務。

場景2

很多具體的業務中都有記錄數據然後進行統計的需求場景,比如那些統計uv,pv的系統。日誌型的數據量非常大,而且還有可能有峰值的出現,如果用關係型數據庫來存儲,很有可能在IO上會出現瓶頸,而且有可能會影響其他正常的業務,更不幸的是當執行統計語句的時候,性能更是差強人意。這樣的日誌型統計業務很適合HBase這樣的列式Nosql,業務上要統計一天的uv,pv數據,HBase很適合統計某一列數據的場景,因為只需要把對應的列進行統計即可,不像關係型數據庫那樣需要把所有行都加載進內存,而且列式存儲一般比行式存儲擁有更大的壓縮比例,佔用的磁盤空間會更少。

程序員修神之路--用NOSql給高併發系統加速(繼續送書)

列式存儲的應用場景有一定的限制,一般用於統計和大數據的分析中。

場景3

在多數高併發系統中都存在緩存的設計,而緩存的一般數據結構都是K-V結構。緩存是一種提高系統性能的有效手段,因其需要提供快速訪問的特性,一般緩存都放置於內存當中。比如現在我們要設計一個用戶管理系統,每個用戶信息可以做緩存以便提供高速的訪問,由於很多系統都採用分佈式的部署方式,所以採用進程內的緩存方式並不可取,這個時候就需要有一種高速的外部存儲來提供這種業務,這正是kv型Nosql的典型應用場景之一。其中以redis為代表,具體的業務中可以以用戶id為key,用戶的信息為value存儲在redis中,而且redis在3.0之後可以做集群了,在高可用和擴展上更能助力業務方。redis支持的數據類型很多,在不同的場景下選擇不同的數據類型。

場景4

當一個系統有搜索的業務時候,如果搜索的條件是一些簡單的類型搜索,關係型數據庫還可以滿足,但是如果有全文搜索,就是我們平時sql寫的like ‘%xx%’這樣的搜索,關係型數據庫可能並不是最好的選擇,全文搜索引擎類型的Nosql也許是一個更好的解決方案,其中以Elasticsearch 為代表。全文搜索引擎的搜索的條件可以隨意排列組合,並且可以實現關係型數據庫like方式的模糊匹配。

全文搜索引擎的技術原理稱為“倒排索引”(inverted index),是一種索引方法,其基本原理是建立單詞到文檔的索引。與之相對是,是“正排索引”,其基本原理是建立文檔到單詞的索引。

場景5

在社交系統中最常見例子就是社會網絡中人與人之間的關係。關係型數據庫用於存儲“關係型”數據的效果並不好,其查詢複雜、緩慢、超出預期,而圖形數據庫的獨特設計恰恰彌補了這個缺陷,解決關係型數據庫存儲和處理複雜關係型數據功能較弱的問題。其中以Neo4j為代表。想深入研究的同學請移步百度。

無論是關係型數據庫還是nosql數據庫都不是銀彈,每一種事物都有它最善長的領域。設計一個好的系統,需要綜合考慮各種因素,根據具體的業務場景來選擇最合適的解決方案。

"


程序員修神之路--用NOSql給高併發系統加速(繼續送書)


領取福利

記得長按,領取技術書籍哦

隨著互聯網大潮的到來,越來越多網站,應用系統需要海量數據的支撐,高併發、低延遲、高可用、高擴展等要求在傳統的關係型數據庫中已經得不到滿足,或者說關係型數據庫應對這些需求已經顯得力不從心了。關係型數據庫經過幾十年的發展已經很成熟,強大的sql語句支持,完美的ACID屬性的支持,使得關係型數據庫廣泛應用於各種各樣的應用系統中,但是應用的場景廣泛並非意味著完美。

- 由於關係型數據庫是按行進行存儲的,在某些只統計一列的需求場景下,也需要把整行讀入內存,導致了一個小小的統計需求高IO的缺點

- 關係型數據庫無法存儲數據結構,比如:一個商品可以從屬於多個分類,業務上的從屬關係體現到存儲上是一個列表而已,但是關係型數據庫需要把這些關係存儲為多行,無法直接存儲為一個列表。

- 關係型數據庫中的存儲單位表的架構是強約束,操作不存在的列會報出異常,而且添加、更新、刪除列必須執行DDL語句,如果表的現存數據量比較大,會出現長時間鎖表的現象。

- 關係型數據庫全文搜索功能普通比較弱,用like去匹配關鍵詞的時候,數據量比較大的情況下會出現慢查詢的現象。

- 關係型數據庫基於表格的關係模型使得很難添加新的或不同種類的關聯信息。

由於以上這些諸多問題,便誕生了以“NOSQL”為口號的很多解決方案。在某些關係型數據庫不擅長的領域,Nosql表現的很出色。上天是公平的,給你打開了一扇窗戶,必會給你關上半扇門,NoSql是以犧牲ACID某個或者某些特性為代價的。

NoSQL並不是銀彈,更多的時候是關係型數據庫一個有力補充,或者是特定場景下優於關係型數據庫的一種解決方案

程序員修神之路--用NOSql給高併發系統加速(繼續送書)

NoSQL

NoSQL,泛指非關係型的數據庫。現在大家更喜歡翻譯成:not only sql

程序員修神之路--用NOSql給高併發系統加速(繼續送書)

根據NoSQL的存儲等特性,大體可以分為以下幾類

- 鍵值(Key-Value)存儲數據庫。相關的產品:Redis、Riak、SimpleDB、Chordless、Scalaris、Memcached。主要解決關係數據庫無法存儲數據結構的問題。

- 列存儲數據庫。相關產品:BigTable、HBase、Cassandra、HadoopDB、GreenPlum、PNUTS。解決關係數據庫大數據場景下的 I/O 問題

- 文檔數據庫。相關產品:MongoDB、CouchDB、ThruDB、CloudKit、Perservere、Jackrabbit。解決關係數據庫強 schema 約束的問題。

- 圖形數據庫。相關產品:Neo4J、OrientDB、InfoGrid、GraphDB。主要解決大量複雜、互連接、低結構化的圖結構場合,如社交網絡、推薦系統等

- 全文搜索引擎。相關產品:Elasticsearch。主要解決關係數據庫的全文搜索性能問題。

由此可見,沒有哪一種NoSql是完美的,每一種Nosql都有自己擅長的領域,這也是我們做系統架構中要考慮的重要因素。

場景1

電商的商品設計過程中,每種商品的屬性都不同,屬性數目不同,屬性名不同,同一個商品有可能會屬於多個分類,而且隨著業務的發展,很多商品會增加新的屬性,而且最令程序員頭疼莫過於每種屬性都有可能有搜索的可能性(當然搜索可以利用搜索引擎來實現)。遇到這樣的需求場景,如果利用關係型數據庫來存儲的話,表的字段會非常多,而且字段的定義非常令人頭疼。

這樣的場景非常適合NOsql中的文檔型數據庫,比如MongoDB。文檔型數據庫新增字段非常簡單,不像關係型數據庫需要先執行DDL來增加字段,直接可以利用程序來進行讀寫,歷史數據就算是沒有相應的字段也不會有異常的情況發生。最重要的一點,文檔型數據庫很擅長存儲複雜結構的數據,一般情況下業務上可以利用表現能力很強的json數據結構。

{
"Id":1,
"ProductName":"杜蕾斯加強版",
"Price":100,
"Type":[
1,
2,
4
],
"Length":20,
"Height":2
}

如果所有商品信息都用mongodb來存儲的話,有的場景並不是十分完美。比如商品被成功購買之後扣庫存的問題,聯合查詢的問題,由於Nosql天生對ACID支持不足的原因,一個事務性的操作很難在Nosql中實現,所以設計系統的時候在很多情況下是關係數據庫+Nosql 來共同實現業務。

場景2

很多具體的業務中都有記錄數據然後進行統計的需求場景,比如那些統計uv,pv的系統。日誌型的數據量非常大,而且還有可能有峰值的出現,如果用關係型數據庫來存儲,很有可能在IO上會出現瓶頸,而且有可能會影響其他正常的業務,更不幸的是當執行統計語句的時候,性能更是差強人意。這樣的日誌型統計業務很適合HBase這樣的列式Nosql,業務上要統計一天的uv,pv數據,HBase很適合統計某一列數據的場景,因為只需要把對應的列進行統計即可,不像關係型數據庫那樣需要把所有行都加載進內存,而且列式存儲一般比行式存儲擁有更大的壓縮比例,佔用的磁盤空間會更少。

程序員修神之路--用NOSql給高併發系統加速(繼續送書)

列式存儲的應用場景有一定的限制,一般用於統計和大數據的分析中。

場景3

在多數高併發系統中都存在緩存的設計,而緩存的一般數據結構都是K-V結構。緩存是一種提高系統性能的有效手段,因其需要提供快速訪問的特性,一般緩存都放置於內存當中。比如現在我們要設計一個用戶管理系統,每個用戶信息可以做緩存以便提供高速的訪問,由於很多系統都採用分佈式的部署方式,所以採用進程內的緩存方式並不可取,這個時候就需要有一種高速的外部存儲來提供這種業務,這正是kv型Nosql的典型應用場景之一。其中以redis為代表,具體的業務中可以以用戶id為key,用戶的信息為value存儲在redis中,而且redis在3.0之後可以做集群了,在高可用和擴展上更能助力業務方。redis支持的數據類型很多,在不同的場景下選擇不同的數據類型。

場景4

當一個系統有搜索的業務時候,如果搜索的條件是一些簡單的類型搜索,關係型數據庫還可以滿足,但是如果有全文搜索,就是我們平時sql寫的like ‘%xx%’這樣的搜索,關係型數據庫可能並不是最好的選擇,全文搜索引擎類型的Nosql也許是一個更好的解決方案,其中以Elasticsearch 為代表。全文搜索引擎的搜索的條件可以隨意排列組合,並且可以實現關係型數據庫like方式的模糊匹配。

全文搜索引擎的技術原理稱為“倒排索引”(inverted index),是一種索引方法,其基本原理是建立單詞到文檔的索引。與之相對是,是“正排索引”,其基本原理是建立文檔到單詞的索引。

場景5

在社交系統中最常見例子就是社會網絡中人與人之間的關係。關係型數據庫用於存儲“關係型”數據的效果並不好,其查詢複雜、緩慢、超出預期,而圖形數據庫的獨特設計恰恰彌補了這個缺陷,解決關係型數據庫存儲和處理複雜關係型數據功能較弱的問題。其中以Neo4j為代表。想深入研究的同學請移步百度。

無論是關係型數據庫還是nosql數據庫都不是銀彈,每一種事物都有它最善長的領域。設計一個好的系統,需要綜合考慮各種因素,根據具體的業務場景來選擇最合適的解決方案。

程序員修神之路--用NOSql給高併發系統加速(繼續送書)


架構師之路,菜菜與君一起成長

"


程序員修神之路--用NOSql給高併發系統加速(繼續送書)


領取福利

記得長按,領取技術書籍哦

隨著互聯網大潮的到來,越來越多網站,應用系統需要海量數據的支撐,高併發、低延遲、高可用、高擴展等要求在傳統的關係型數據庫中已經得不到滿足,或者說關係型數據庫應對這些需求已經顯得力不從心了。關係型數據庫經過幾十年的發展已經很成熟,強大的sql語句支持,完美的ACID屬性的支持,使得關係型數據庫廣泛應用於各種各樣的應用系統中,但是應用的場景廣泛並非意味著完美。

- 由於關係型數據庫是按行進行存儲的,在某些只統計一列的需求場景下,也需要把整行讀入內存,導致了一個小小的統計需求高IO的缺點

- 關係型數據庫無法存儲數據結構,比如:一個商品可以從屬於多個分類,業務上的從屬關係體現到存儲上是一個列表而已,但是關係型數據庫需要把這些關係存儲為多行,無法直接存儲為一個列表。

- 關係型數據庫中的存儲單位表的架構是強約束,操作不存在的列會報出異常,而且添加、更新、刪除列必須執行DDL語句,如果表的現存數據量比較大,會出現長時間鎖表的現象。

- 關係型數據庫全文搜索功能普通比較弱,用like去匹配關鍵詞的時候,數據量比較大的情況下會出現慢查詢的現象。

- 關係型數據庫基於表格的關係模型使得很難添加新的或不同種類的關聯信息。

由於以上這些諸多問題,便誕生了以“NOSQL”為口號的很多解決方案。在某些關係型數據庫不擅長的領域,Nosql表現的很出色。上天是公平的,給你打開了一扇窗戶,必會給你關上半扇門,NoSql是以犧牲ACID某個或者某些特性為代價的。

NoSQL並不是銀彈,更多的時候是關係型數據庫一個有力補充,或者是特定場景下優於關係型數據庫的一種解決方案

程序員修神之路--用NOSql給高併發系統加速(繼續送書)

NoSQL

NoSQL,泛指非關係型的數據庫。現在大家更喜歡翻譯成:not only sql

程序員修神之路--用NOSql給高併發系統加速(繼續送書)

根據NoSQL的存儲等特性,大體可以分為以下幾類

- 鍵值(Key-Value)存儲數據庫。相關的產品:Redis、Riak、SimpleDB、Chordless、Scalaris、Memcached。主要解決關係數據庫無法存儲數據結構的問題。

- 列存儲數據庫。相關產品:BigTable、HBase、Cassandra、HadoopDB、GreenPlum、PNUTS。解決關係數據庫大數據場景下的 I/O 問題

- 文檔數據庫。相關產品:MongoDB、CouchDB、ThruDB、CloudKit、Perservere、Jackrabbit。解決關係數據庫強 schema 約束的問題。

- 圖形數據庫。相關產品:Neo4J、OrientDB、InfoGrid、GraphDB。主要解決大量複雜、互連接、低結構化的圖結構場合,如社交網絡、推薦系統等

- 全文搜索引擎。相關產品:Elasticsearch。主要解決關係數據庫的全文搜索性能問題。

由此可見,沒有哪一種NoSql是完美的,每一種Nosql都有自己擅長的領域,這也是我們做系統架構中要考慮的重要因素。

場景1

電商的商品設計過程中,每種商品的屬性都不同,屬性數目不同,屬性名不同,同一個商品有可能會屬於多個分類,而且隨著業務的發展,很多商品會增加新的屬性,而且最令程序員頭疼莫過於每種屬性都有可能有搜索的可能性(當然搜索可以利用搜索引擎來實現)。遇到這樣的需求場景,如果利用關係型數據庫來存儲的話,表的字段會非常多,而且字段的定義非常令人頭疼。

這樣的場景非常適合NOsql中的文檔型數據庫,比如MongoDB。文檔型數據庫新增字段非常簡單,不像關係型數據庫需要先執行DDL來增加字段,直接可以利用程序來進行讀寫,歷史數據就算是沒有相應的字段也不會有異常的情況發生。最重要的一點,文檔型數據庫很擅長存儲複雜結構的數據,一般情況下業務上可以利用表現能力很強的json數據結構。

{
"Id":1,
"ProductName":"杜蕾斯加強版",
"Price":100,
"Type":[
1,
2,
4
],
"Length":20,
"Height":2
}

如果所有商品信息都用mongodb來存儲的話,有的場景並不是十分完美。比如商品被成功購買之後扣庫存的問題,聯合查詢的問題,由於Nosql天生對ACID支持不足的原因,一個事務性的操作很難在Nosql中實現,所以設計系統的時候在很多情況下是關係數據庫+Nosql 來共同實現業務。

場景2

很多具體的業務中都有記錄數據然後進行統計的需求場景,比如那些統計uv,pv的系統。日誌型的數據量非常大,而且還有可能有峰值的出現,如果用關係型數據庫來存儲,很有可能在IO上會出現瓶頸,而且有可能會影響其他正常的業務,更不幸的是當執行統計語句的時候,性能更是差強人意。這樣的日誌型統計業務很適合HBase這樣的列式Nosql,業務上要統計一天的uv,pv數據,HBase很適合統計某一列數據的場景,因為只需要把對應的列進行統計即可,不像關係型數據庫那樣需要把所有行都加載進內存,而且列式存儲一般比行式存儲擁有更大的壓縮比例,佔用的磁盤空間會更少。

程序員修神之路--用NOSql給高併發系統加速(繼續送書)

列式存儲的應用場景有一定的限制,一般用於統計和大數據的分析中。

場景3

在多數高併發系統中都存在緩存的設計,而緩存的一般數據結構都是K-V結構。緩存是一種提高系統性能的有效手段,因其需要提供快速訪問的特性,一般緩存都放置於內存當中。比如現在我們要設計一個用戶管理系統,每個用戶信息可以做緩存以便提供高速的訪問,由於很多系統都採用分佈式的部署方式,所以採用進程內的緩存方式並不可取,這個時候就需要有一種高速的外部存儲來提供這種業務,這正是kv型Nosql的典型應用場景之一。其中以redis為代表,具體的業務中可以以用戶id為key,用戶的信息為value存儲在redis中,而且redis在3.0之後可以做集群了,在高可用和擴展上更能助力業務方。redis支持的數據類型很多,在不同的場景下選擇不同的數據類型。

場景4

當一個系統有搜索的業務時候,如果搜索的條件是一些簡單的類型搜索,關係型數據庫還可以滿足,但是如果有全文搜索,就是我們平時sql寫的like ‘%xx%’這樣的搜索,關係型數據庫可能並不是最好的選擇,全文搜索引擎類型的Nosql也許是一個更好的解決方案,其中以Elasticsearch 為代表。全文搜索引擎的搜索的條件可以隨意排列組合,並且可以實現關係型數據庫like方式的模糊匹配。

全文搜索引擎的技術原理稱為“倒排索引”(inverted index),是一種索引方法,其基本原理是建立單詞到文檔的索引。與之相對是,是“正排索引”,其基本原理是建立文檔到單詞的索引。

場景5

在社交系統中最常見例子就是社會網絡中人與人之間的關係。關係型數據庫用於存儲“關係型”數據的效果並不好,其查詢複雜、緩慢、超出預期,而圖形數據庫的獨特設計恰恰彌補了這個缺陷,解決關係型數據庫存儲和處理複雜關係型數據功能較弱的問題。其中以Neo4j為代表。想深入研究的同學請移步百度。

無論是關係型數據庫還是nosql數據庫都不是銀彈,每一種事物都有它最善長的領域。設計一個好的系統,需要綜合考慮各種因素,根據具體的業務場景來選擇最合適的解決方案。

程序員修神之路--用NOSql給高併發系統加速(繼續送書)


架構師之路,菜菜與君一起成長

程序員修神之路--用NOSql給高併發系統加速(繼續送書)


"

相關推薦

推薦中...