首先: NoSql = not only sql 。。。 估計第一次見的就我一個覺得是不用sql。。。html
1. NoSql泛指非關係數據庫。(mysql,oracle 都是經典的關係數據庫)mysql
2. 關係型數據庫 和 非關係數據庫 最簡單的區別:redis
關係型數據庫是有行列的,柵格結構。spring
非關係型不用行列結構存儲數據。而是其餘形式儲存數據:好比key value鍵值對,列,BSON,圖 等結構sql
3.非關係型 vs 關係型數據庫
非關係型數據庫的優勢:緩存
1. nosql能夠直接存儲對象,圖片等,並且更利於擴展,添加緩存,分佈式存儲。(關係數據庫有表關係,join,外鍵一類的,致使牽一線而動全身,分佈式存儲會很困難)服務器
2. nosql讀寫更快。 (關係數據庫須要用同時更新索引因此會比較慢)架構
關係型數據庫的優勢:oracle
1. 由於有索引因此查詢更快
2. 標準化的表結構保證了數據的一致性,使得事務邏輯更清晰。
3. 可使用join等複雜查詢。
4. 並且發展時間長,更加穩定可靠。
爲何使用NoSql
1.
傳統網站架構:
數據庫 - spring(dio, service) - springMVC(controller) - view(jsp/html)
隨着用戶訪問量增長,一個數據庫可能沒法處理那麼多數據,須要改進
解決:
1. 添加cache(緩存), 處於dal和數據庫之間,把常用的數據直接從緩存中讀取而不是重複數據庫查詢。
2.主從分離,讀寫分離。 在不一樣數據庫上設立主表和從表,主表存常常修改的數據(好比商品評價),從表存只讀不寫的數據(好比淘寶的用戶帳號信息,商品基本信息)。
3.分佈式集羣。 使用分佈式(簡單說就是把一個工程的數據分佈到不少個服務器上)用多個服務器用來存儲數據。(好比一個專門存客戶,一個專門存商家,一個專門存商品等)
4. 後來隨着數量愈來愈大,關係型數據庫在分佈式方面的弱勢愈來愈明顯,因此出現了NoSql
因爲Nosql修改快,mysql查詢快,因此目前主流結構是:Nosql 和 mysql 結合。
商品基本信息:mysql
商品描述(大字段):MongDB
商品圖片:文件存儲數據庫TFS
商品熱搜高頻字段:內存數據庫(redis)
數據庫事務特色:
傳統數據庫ACID:
Atomic(原子性)
Consistency(一致性)
Isolation(隔離性)
Durability(持久性)
CAP:
mysql 等數據庫就是CA類型
redis,MongDB等是CP
CouchDB是AP原則。
大多數網站開發遵循AP原則:
由於分佈式系統中,分區是必須的,因此P鎖定了。
而後可用性確定要一直保證。
而爲了解決一致性,採用用BASE的原則:
基本可用(basically available):保證C
軟狀態(soft state):數據能夠暫時性不一致
最終一致(eventually consistent):在最後的時候保持一致
好比雙11,爲了減小壓力,能夠容許一些數據不一致(好比你在雙11的 0 點買了一個商品,60%的人都是在那1分鐘內點下單,因此先只更新客戶表和庫存表,讓你知道你買了。可能商家的表裏還沒更新,他還不知道你買了)。等過了高峯後再同步各個分佈式數據庫的數據。