天天看點

程式員不得不學的大型網站架構技術細節:後端架構非關系型資料庫

作者:程式員進階碼農II

非關系型資料庫

前面曾提到,非關系型資料庫可以為關系型資料庫減輕壓力,也可作為關系型資料庫的補充。而非關系型資料庫并沒有明确的範圍和定義,

是一類資料庫的總稱。非關系型資料庫一般包括以下幾類:

·鍵值存儲非關系型資料庫,如Redis、Memcached等;

·列存儲非關系型資料庫,如HBase、Cassandra等;

·文檔型非關系型資料庫,如MongoDB、CouchDB等;

·圖形非關系型資料庫,如Neo4J、InfoGrid等。

以上非關系型資料庫的分類是按存儲的資料結構區分的,但即使是相同類型的非關系型資料庫,其使用規則和工作原理都是大相徑庭的,是以在選用具體的非關系型資料庫時,需要根據實際問題和團隊習慣而定。本節将介紹各類非關系型資料庫及其應用場景。

鍵值存儲非關系型資料庫

鍵值(Key-Value)存儲非關系型資料庫的資料按照“鍵值對”的形式進行組織、索引和存儲,其存儲的資料結構類似于哈希表。由于資料結構相當簡單,是以此類非關系型資料庫一般被用作記錄一些零碎或簡單的資料,如會話資訊、配置參數、暫存資訊等。

說明:“鍵值對”的具體形式在不同的鍵值存儲非關系型資料庫中有所不同,以Redis為例,Redis的“鍵值對中的值”支援字元串、哈希表、清單、集合、有序集合等資料類型。

僅從資料結構類型看的話,此類資料庫存在的意義不大,因為關系型資料庫也能相容這種資料結構。鍵值存儲非關系型資料庫的優勢不是它的資料結構特性,而是它的性能。因為大部分的鍵值存儲非關系型資料庫都是記憶體型資料庫,也就是說資料是直接被存儲在記憶體上的,是以資料的存取性能會非常高。

由于鍵值存儲非關系型資料庫的性能特性,是以它常常被用作網站系統的緩存容器,以減輕關系型資料庫的并發壓力。目前比較流行的鍵值存儲非關系型資料庫有Redis、Memcached等。

說明:Redis一般用于緩存簡單的資料,Memcached除了可以緩存資料外,還可以緩存圖檔等檔案。一般來說,網站系統中使用Redis作為緩存容器就足夠了,因為圖檔等檔案一般交由CDN進行緩存。

一般來說,使用鍵值存儲非關系型資料庫作為緩存容器的目的有兩個,一是降低資料的讀頻率,二是降低資料的更新頻率。

1.降低資料的讀頻率

引用Redis等鍵值存儲非關系型資料庫可以對預期通路量大并且更新機率較少的資料進行緩存,這樣可以大大減小關系型資料庫的查詢壓力。針對後端應用程式而言,使用鍵值存儲非關系型資料庫減輕資料讀頻率的工作流程如圖4.81所示。

程式員不得不學的大型網站架構技術細節:後端架構非關系型資料庫

圖4.81 使用鍵值存儲非關系型資料庫降低資料讀頻率的工作流程

說明:緩存的具體實作可以直接使用Redis等鍵值存儲非關系型資料庫,也可以使用一些緩存架構(如Spring Boot中可以使用ehcache實作緩存)。

2.降低資料的更新頻率

針對某些需要頻繁更新的資料(如點選量、分享量等資料),可以引用Redis等鍵值存儲非關系型資料庫作為資料中轉站,更新資料時不直接更新資料庫中的資料,隻更新Redis等鍵值存儲非關系型資料庫中的資料,一段時間後,再把資料更新到資料庫中,如圖4.82所示。

程式員不得不學的大型網站架構技術細節:後端架構非關系型資料庫

圖4.82 使用鍵值存儲非關系型資料庫降低資料更新頻率的工作流程

說明:圖4.82中的定時程式可以是後端應用程式中的定時任務,但是後端應用程式可能被部署在多個伺服器上,如果是這樣的話,則需要使用Quartz等分布式定時器架構以避免發生定時任務被多次執行的情況。

列存儲非關系型資料庫

列存儲非關系型資料庫是以列相關進行存儲的資料庫,主要适用于海量資料的存儲。目前比較流行的列存儲非關系型資料庫有HBase、Cassandra等。相對于關系型資料庫的按行存儲方式,列存儲非關系型資料庫是按列來存儲資料的,如圖4.83所示。

相對于行式存儲的關系型資料庫,列存儲非關系型資料庫有以下兩個特點,這兩個特點隻有在處理海量資料時才能展現出來。

·高效的存儲空間使用率,由于一列内的資料類型是一緻的,是以列存儲非關系型資料庫可以更高效地壓縮資料。

程式員不得不學的大型網站架構技術細節:後端架構非關系型資料庫

圖4.83 按行存儲與按列存儲

·當搜尋條件較少時,查詢效率高,因為資料是按列存儲的,可以通過指定列資料快速擷取資料所在的位置。如“擷取李四的身高”這個查詢,查詢過程不需要周遊所有的資料,在“姓名”列中找到“李四”處在第二行,然後在“身高”列直接擷取第二行資料即為“李四的身高”。

但是,列存儲非關系型資料庫不适合随機更新(更新的消耗較大),不支援事務復原。是以,列存儲非關系型資料庫适合存儲一些存儲量大、幾乎不更新、查詢時條件較少的資料,如日志、消息記錄等。

文檔型非關系型資料庫

文檔型非關系型資料庫是指将半結構化資料存儲為文檔的一種資料庫。

文檔資料庫通常以XML、JSON等格式存儲資料。簡單地說,文檔型非關系型資料庫允許存儲XML、JSON等格式的資料。目前比較流行的文檔型非關系型資料庫有MongoDB、CouchDB等。

說明:半結構化資料是結構化資料的一種形式,但它并不符合關系型資料庫等以“表形式”關聯起來的資料模型結構,常見的半結構化資料有XML資料、JSON資料等。

由于文檔型非關系型資料庫支援存儲JSON等格式的資料,是以在資料結構上非常靈活,增減字段都變得簡單。但是,大多數文檔型非關系型資料庫都不支援事務,而且不支援複雜查詢。

是以,文檔型非關系型資料庫适合存儲量很大(或以後會變得很大)、結構不明确(字段需要不斷調整)的資料。

圖形非關系型資料庫

圖形非關系型資料庫是應用圖形理論存儲實體之間關系的資料庫。關系型資料庫不适合存儲“關系複雜”的資料,随着資料量增加,其查詢複雜性會逐漸超出控制。最常見的例子為社交網絡中的人際關系,如圖4.84所示,其中,連線的為好友關系。在面對這些“關系複雜”的資料,且其資料量很大(或以後會變得很大)時,基本上隻能用圖形非關系型資料庫。目前比較流行的圖形非關系型資料庫有Neo4J、InfoGrid等。

程式員不得不學的大型網站架構技術細節:後端架構非關系型資料庫

圖4.84 社交網絡中的人際關系

小結

後端應用程式在整個網站系統中處于“司令塔”的位置,網站系統的品質很大程度上取決于後端應用程式。由于後端應用程式的重要性和複雜性,出現了很多技術架構,很多人都沉迷于學習各種各樣的技術架構,甚至認為後端應用程式就是在使用現成架構的基礎上,用代碼整合資料庫、Redis、第三方應用等的膠水程式。而事實上,任何技術架構都隻是解決問題的手段,使用某個技術也不能成為後端應用程式的目的,是以使用什麼技術架構不重要,其是否能解決所需要解決的問題才是最重要的。

本章介紹了後端架構需要關注的細節及對應的解決方法,其中包括規整化、資料庫和非關系型資料庫。本章盡量以問題出發,進而介紹對應的解決方法,希望讀者在了解這些問題和解決方法後,對後端架構能有一個清晰的認知。

本章主要介紹的是後端應用程式本身以及在後端應用程式開發過程中需要注意的細節。

本文給大家講解的内容是大型網站架構的技術細節:後端架構非關系型資料庫

  1. 下篇文章給大家講解的内容是大型網站架構的技術細節:雲計算服務架構,雲計算服務的工作原理
  2. 感謝大家的支援

繼續閱讀