數據多的時候為什麼要使用redis而不用mysql?
Redis和MySQL的應用場景是不同的。
通常來說,沒有說用Redis就不用MySQL的這種情況。
因為Redis是一種非關係型資料庫(NoSQL),而MySQL是一種關係型資料庫。
和Redis同類的資料庫還有MongoDB和Memchache(其實並沒有持久化數據)
那關係型資料庫現在常用的一般有MySQL,SQL Server,Oracle。
我們先來了解一下關係型資料庫和非關係型資料庫的區別吧。
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.授權方式大多數的關係型資料庫都是付費的並且價格昂貴,成本較大(MySQL是開源的,所以應用的場景最多),而Nosql資料庫通常都是開源的。
所以,在實際的應用環境中,我們一般會使用MySQL存儲我們的業務過程中的數據,因為這些數據之間的關係比較複雜,我們常常會需要在查詢一個表的數據時候,將其他關係表的數據查詢出來,例如,查詢某個用戶的訂單,那至少是需要用戶表和訂單表的數據。
查詢某個商品的銷售數據,那可能就會需要用戶表,訂單表,訂單明細表,商品表等等。
而在這樣的使用場景中,我們使用Redis來存儲的話,也就是KeyValue形式存儲的話,其實並不能滿足我們的需要。
即使Redis的讀取效率再高,我們也沒法用。
但,對於某些沒有關聯少,且需要高頻率讀寫,我們使用Redis就能夠很好的提高整個體統的並發能力。
例如商品的庫存信息,我們雖然在MySQL中會有這樣的欄位,但是我們並不想MySQL的資料庫被高頻的讀寫,因為使用這樣會導致我的商品表或者庫存表IO非常高,從而影響整個體統的效率。
所以,對於這樣的數據,且有沒有什麼複雜邏輯關係(就只是隸屬於SKU)的數據,我們就可以放在Redis裡面,下單直接在Redis中減掉庫存,這樣,我們的訂單的並發能力就能夠提高了。
首先,不是選用redis或者mysql是根據數據多少來定的,這兩個資料庫的用法區別並不是在於儲存數據的多少。
其次,我們來看下這兩個資料庫,mysql是一種關係資料庫管理系統,是持久化儲存,它將數據保存在不同的表中。而redis是一個高性能的key-value資料庫,它並不存在關係型資料庫。redis的數據是緩存並留駐在內存中運行的,而mysql的是放在磁碟中的,單就這點來說,你還會覺得這個問題問得正確嗎?mysql是關係型資料庫,它的功能比較強大,但是當cpu訪問數據時,它可不會先去訪問磁碟,而是先去訪問內存當前正在運行的那部分數據,這樣以來,redis的速度就要比mysql快。一般中小型網站的開發選擇用mysql,因為mysq體積小、速度快、總體擁有成本低,還有一個特殊的地方,就是源代碼公開。但是對於大型互聯網公司來說,mysq就很難滿足他們的需求,因為特定的系統絕大部分的檢索在很多時候都是基於主鍵的查詢,這樣一來,如果選用關係型資料庫的話,那麼將會使得效率比較低下。一般web每次只訪問redis,然後在沒有找到數據的情況下,才去訪問mysql,因此,選擇key-value資料庫就是無可厚非的。
最後,我覺得,你在選擇時應該是要看情況是怎樣的,哪種更符合需求,而不是單看數據的大小。
首先就題目來說,這個說法是個偽命題,沒有任何理論依據和實踐支持。
大家都知道mysql和redis的應用場景不一樣,mysql是關係型資料庫,redis是key-value的內存資料庫。mysql將數據持久化到磁碟,而redis雖然也支持持久化,但主要應用場景仍然是使用內存來實現緩存的目的,所以理論上mysql可以有效管理的數據量比redis多得多。
redis相比mysql的優勢在於直接使用內存讀寫數據,速度比mysql快,但是內存容量有限,所以大多數應用使用redis來緩存熱點數據,達到提升應用性能的目的,而結構化數據仍然使用關係型資料庫來存儲。
因此,訪問頻率較高的熱點數據使用redis來進行緩存才是最普遍的互聯網應用實踐。
不能籠統的這麼說,這兩個東西有完全不同的應用場景。也要看數據多到什麼程度。
redis是一個內存數據結構的服務,它將數據存儲在內存中,從而實現了非常好的吞吐量和性能。它有提供了很豐富的數據結構,特別適合社交類業務的系統。但是內存資料庫要求伺服器的內存足夠才行,存儲的數據量越大消耗的內存也就越大,如果內存不夠就會導致操作系統進行內存到磁碟的交換結構性能急劇下降。新浪微博的數據存儲就是用的redis來實現的。
mysql是一個傳統的資料庫系統,因為它的架構非常的靈活,可以集成很多不同方式的存儲。mysql因為大部分都是磁碟操作自然性能比不上redis,但是支持事務等功能。適合於各種業務系統,對於海量的數據存儲並沒有問題。Facebook用的是MySQL的集群。
數據量大,有多大,業務是什麼樣,不能一概而論。用的好一樣可以解決大部分的問題,新浪微博的冷數據就是用MySQL。
架構設計上沒有一條原則叫數據多了要redis,redis主要用做緩存,當然也有用於持久化存儲的,比如世界上很大的那個成人網站。redis能提供單機10萬qps的並發訪問,在高並發的場景下,使用redis可以緩解後端持久化存儲如mysql oracle的壓力
redis是Nosql資料庫中使用較為廣泛的非關係型內存資料庫,redis內部是一個key-value存儲系統。它支持存儲的value類型相對更多,包括string(字元串)、list(鏈表)、set(集合)、zset(sorted set –有序集合)和hash(哈希類型,類似於Java中的map)。Redis基於內存運行並支持持久化的NoSQL資料庫,是當前最熱門的NoSql資料庫之一,也被人們稱為數據結構伺服器。
首先問是不是,再問為什麼。
沒有「數據多的時候使用redis」這種說法(或者說有這種說法,但是這種說法是錯誤的)。
redis是基於內存的kv型資料庫,適用於非結構型、時延敏感、並發量高的場景;
MySQL是關係型資料庫,存儲介質一般為磁碟,適用於對事務要求較高、時延相對不敏感的關係型數據存儲場景。
redis數據都緩存在內存里,key-value形式的,響應速度特別快。mysql是關係型資料庫,適合多表聯查。兩者使用場景不一致的。
推薦閱讀: