人
已閱讀
已閱讀
APP開發(fā)使用的數(shù)據(jù)庫Redis和MySQL的區(qū)別
來源:lexintech.com ?? ?? 發(fā)布時間:2018-05-16
我們在進行APP開發(fā)時,通常會使用MySQL數(shù)據(jù)庫或Redis數(shù)據(jù)庫,這兩種數(shù)據(jù)庫有什么區(qū)別,今天我們來跟大家聊一聊這個問題。
首先,Redis和MySQL的應用場景是不同的。通常來說,沒有說用Redis就不用MySQL的這種情況。因為Redis是一種非關系型數(shù)據(jù)庫(NoSQL),而MySQL是一種關系型數(shù)據(jù)庫。和Redis同類的數(shù)據(jù)庫還有MongoDB和Memchache。Redis是一個開源的使用ANSI C語言編寫、支持網(wǎng)絡、可基于內存亦可持久化的日志型、Key-Value數(shù)據(jù)庫,并提供多種語言的API。
而關系型數(shù)據(jù)庫現(xiàn)在常用的一般有MySQL,SQL Server,Oracle。
我們先來了解一下關系型數(shù)據(jù)庫和非關系型數(shù)據(jù)庫的區(qū)別。
1.存儲方式
關系型數(shù)據(jù)庫是表格式的,因此存儲在表的行和列中。他們之間很容易關聯(lián)協(xié)作存儲,提取數(shù)據(jù)很方便。而Nosql數(shù)據(jù)庫則與其相反,他是大塊的組合在一起。通常存儲在數(shù)據(jù)集中,就像文檔、鍵值對或者圖結構。
2.存儲結構
關系型數(shù)據(jù)庫對應的是結構化數(shù)據(jù),數(shù)據(jù)表都預先定義了結構(列的定義),結構描述了數(shù)據(jù)的形式和內容。這一點對數(shù)據(jù)建模至關重要,雖然預定義結構帶來了可靠性和穩(wěn)定性,但是修改這些數(shù)據(jù)比較困難。而Nosql數(shù)據(jù)庫基于動態(tài)結構,使用與非結構化數(shù)據(jù)。因為Nosql數(shù)據(jù)庫是動態(tài)結構,可以很容易適應數(shù)據(jù)類型和結構的變化。
3.存儲規(guī)范
關系型數(shù)據(jù)庫的數(shù)據(jù)存儲為了更高的規(guī)范性,把數(shù)據(jù)分割為最小的關系表以避免重復,獲得精簡的空間利用。雖然管理起來很清晰,但是單個操作設計到多張表的時候,數(shù)據(jù)管理就顯得有點麻煩。而Nosql數(shù)據(jù)存儲在平面數(shù)據(jù)集中,數(shù)據(jù)經(jīng)??赡軙貜?。單個數(shù)據(jù)庫很少被分隔開,而是存儲成了一個整體,這樣整塊數(shù)據(jù)更加便于讀寫
4.存儲擴展
這可能是兩者之間最大的區(qū)別,關系型數(shù)據(jù)庫是縱向擴展,也就是說想要提高處理能力,要使用速度更快的計算機。因為數(shù)據(jù)存儲在關系表中,操作的性能瓶頸可能涉及到多個表,需要通過提升計算機性能來克服。雖然有很大的擴展空間,但是最終會達到縱向擴展的上限。而Nosql數(shù)據(jù)庫是橫向擴展的,它的存儲天然就是分布式的,可以通過給資源池添加更多的普通數(shù)據(jù)庫服務器來分擔負載。
5.查詢方式
關系型數(shù)據(jù)庫通過結構化查詢語言來操作數(shù)據(jù)庫(就是我們通常說的SQL)。SQL支持數(shù)據(jù)庫CURD操作的功能非常強大,是業(yè)界的標準用法。而Nosql查詢以塊為單元操作數(shù)據(jù),使用的是非結構化查詢語言(UnQl),它是沒有標準的。關系型數(shù)據(jù)庫表中主鍵的概念對應Nosql中存儲文檔的ID。關系型數(shù)據(jù)庫使用預定義優(yōu)化方式(比如索引)來加快查詢操作,而Nosql更簡單更精確的數(shù)據(jù)訪問模式。
6.事務
關系型數(shù)據(jù)庫遵循ACID規(guī)則(原子性(Atomicity)、一致性(Consistency)、隔離性(Isolation)、持久性(Durability)),而Nosql數(shù)據(jù)庫遵循BASE原則(基本可用(Basically Availble)、軟/柔性事務(Soft-state )、最終一致性(Eventual Consistency))。由于關系型數(shù)據(jù)庫的數(shù)據(jù)強一致性,所以對事務的支持很好。關系型數(shù)據(jù)庫支持對事務原子性細粒度控制,并且易于回滾事務。而Nosql數(shù)據(jù)庫是在CAP(一致性、可用性、分區(qū)容忍度)中任選兩項,因為基于節(jié)點的分布式系統(tǒng)中,很難全部滿足,所以對事務的支持不是很好,雖然也可以使用事務,但是并不是Nosql的閃光點。
7.性能
關系型數(shù)據(jù)庫為了維護數(shù)據(jù)的一致性付出了巨大的代價,讀寫性能比較差。在面對高并發(fā)讀寫性能非常差,面對海量數(shù)據(jù)的時候效率非常低。而Nosql存儲的格式都是key-value類型的,并且存儲在內存中,非常容易存儲,而且對于數(shù)據(jù)的 一致性是 弱要求。Nosql無需sql的解析,提高了讀寫性能。
8.授權方式
大多數(shù)的關系型數(shù)據(jù)庫都是付費的并且價格昂貴,成本較大(MySQL是開源的,所以應用的場景最多),而Nosql數(shù)據(jù)庫通常都是開源的。
所以,在實際的應用環(huán)境中,我們一般會使用MySQL存儲我們的業(yè)務過程中的數(shù)據(jù),因為這些數(shù)據(jù)之間的關系比較復雜,我們常常會需要在查詢一個表的數(shù)據(jù)時候,將其他關系表的數(shù)據(jù)查詢出來,例如,查詢某個用戶的訂單,那至少是需要用戶表和訂單表的數(shù)據(jù)。
查詢某個商品的銷售數(shù)據(jù),那可能就會需要用戶表,訂單表,訂單明細表,商品表等等。
而在這樣的使用場景中,我們使用Redis來存儲的話,也就是KeyValue形式存儲的話,其實并不能滿足我們的需要。
即使Redis的讀取效率再高,我們也沒法用。
但,對于某些沒有關聯(lián)少,且需要高頻率讀寫,我們使用Redis就能夠很好的提高整個體統(tǒng)的并發(fā)能力。
例如商品的庫存信息,我們雖然在MySQL中會有這樣的字段,但是我們并不想MySQL的數(shù)據(jù)庫被高頻的讀寫,因為使用這樣會導致我的商品表或者庫存表IO非常高,從而影響整個體統(tǒng)的效率。
所以,對于這樣的數(shù)據(jù),且有沒有什么復雜邏輯關系(就只是隸屬于SKU)的數(shù)據(jù),我們就可以放在Redis里面,下單直接在Redis中減掉庫存,這樣,我們的訂單的并發(fā)能力就能夠提高了。