回覆列表
  • 1 # 會技術的葛大爺

    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中減掉庫存,這樣,我們的訂單的併發能力就能夠提高了。

  • 2 # 平凡的上班族

    不能籠統的這麼說,這兩個東西有完全不同的應用場景。也要看資料多到什麼程度。

    redis是一個記憶體資料結構的服務,它將資料儲存在記憶體中,從而實現了非常好的吞吐量和效能。它有提供了很豐富的資料結構,特別適合社交類業務的系統。但是記憶體資料庫要求伺服器的記憶體足夠才行,儲存的資料量越大消耗的記憶體也就越大,如果記憶體不夠就會導致作業系統進行記憶體到磁碟的交換結構效能急劇下降。新浪微博的資料儲存就是用的redis來實現的。

    mysql是一個傳統的資料庫系統,因為它的架構非常的靈活,可以整合很多不同方式的儲存。mysql因為大部分都是磁碟操作自然效能比不上redis,但是支援事務等功能。適合於各種業務系統,對於海量的資料儲存並沒有問題。Facebook用的是MySQL的叢集。

    資料量大,有多大,業務是什麼樣,不能一概而論。用的好一樣可以解決大部分的問題,新浪微博的冷資料就是用MySQL。

  • 3 # 貓眼架構

    架構設計上沒有一條原則叫資料多了要redis,redis主要用做快取,當然也有用於持久化儲存的,比如世界上很大的那個成人網站。redis能提供單機10萬qps的併發訪問,在高併發的場景下,使用redis可以緩解後端持久化儲存如mysql oracle的壓力

  • 4 # java老菜鳥

    首先就題目來說,這個說法是個偽命題,沒有任何理論依據和實踐支援。

    大家都知道mysql和redis的應用場景不一樣,mysql是關係型資料庫,redis是key-value的記憶體資料庫。mysql將資料持久化到磁碟,而redis雖然也支援持久化,但主要應用場景仍然是使用記憶體來實現快取的目的,所以理論上mysql可以有效管理的資料量比redis多得多。

    redis相比mysql的優勢在於直接使用記憶體讀寫資料,速度比mysql快,但是記憶體容量有限,所以大多數應用使用redis來快取熱點資料,達到提升應用效能的目的,而結構化資料仍然使用關係型資料庫來儲存。

    因此,訪問頻率較高的熱點資料使用redis來進行快取才是最普遍的網際網路應用實踐。

  • 5 # 深夜老王

    首先問是不是,再問為什麼。

    沒有“資料多的時候使用redis”這種說法(或者說有這種說法,但是這種說法是錯誤的)。

    redis是基於記憶體的kv型資料庫,適用於非結構型、時延敏感、併發量高的場景;

    MySQL是關係型資料庫,儲存介質一般為磁碟,適用於對事務要求較高、時延相對不敏感的關係型資料儲存場景。

  • 6 # 軟體測試

    redis資料都快取在記憶體裡,key-value形式的,響應速度特別快。mysql是關係型資料庫,適合多表聯查。兩者使用場景不一致的。

  • 7 # 紅塵小書童

    首先,不是選用redis或者mysql是根據資料多少來定的,這兩個資料庫的用法區別並不是在於儲存資料的多少。

    其次,我們來看下這兩個資料庫,mysql是一種關係資料庫管理系統,是持久化儲存,它將資料儲存在不同的表中。而redis是一個高效能的key-value資料庫,它並不存在關係型資料庫。redis的資料是快取並留駐在記憶體中執行的,而mysql的是放在磁碟中的,單就這點來說,你還會覺得這個問題問得正確嗎?mysql是關係型資料庫,它的功能比較強大,但是當cpu訪問資料時,它可不會先去訪問磁碟,而是先去訪問記憶體當前正在執行的那部分資料,這樣以來,redis的速度就要比mysql快。一般中小型網站的開發選擇用mysql,因為mysq體積小、速度快、總體擁有成本低,還有一個特殊的地方,就是原始碼公開。但是對於大型網際網路公司來說,mysq就很難滿足他們的需求,因為特定的系統絕大部分的檢索在很多時候都是基於主鍵的查詢,這樣一來,如果選用關係型資料庫的話,那麼將會使得效率比較低下。一般web每次只訪問redis,然後在沒有找到資料的情況下,才去訪問mysql,因此,選擇key-value資料庫就是無可厚非的。

    最後,我覺得,你在選擇時應該是要看情況是怎樣的,哪種更符合需求,而不是單看資料的大小。

  • 8 # 樂哈哈電影

    redis是Nosql資料庫中使用較為廣泛的非關係型記憶體資料庫,redis內部是一個key-value儲存系統。它支援儲存的value型別相對更多,包括string(字串)、list(連結串列)、set(集合)、zset(sorted set –有序集合)和hash(雜湊型別,類似於Java中的map)。Redis基於記憶體執行並支援持久化的NoSQL資料庫,是當前最熱門的NoSql資料庫之一,也被人們稱為資料結構伺服器。

  • 9 # 初沏的茶

    這個命題首先就有問題,redis是key-value型的記憶體資料庫,而mysql是關係型資料庫。兩者使用場景不同,前者主要用於實時響應要求高的場景,響應時間在毫秒級,通常作為熱點資料的快取使用。後者通常用於結構化資料的持久化和傳統的事務處理場景。兩者使用場景主要是根據資料型別、響應時間、事務型別等方面考慮,資料量並不是選擇哪個的資料庫的決定因素。

  • 10 # 關注我你不會後悔

    這個問題的標題是有錯誤的,二者應用的場景不同功能不同 作用不同。

    redis 並不是用來解決資料多的問題的。redis 代替不了 SQL,二者間是合作關係,經常是一同使用。

    redis 適用於經常呼叫,又經常變化的臨時資料。或者恆久不變的,但要經常呼叫的資料。資料量通常不是特別大,存於記憶體中,資料成本較高,但效率高,不佔用磁碟 lO。

    而MYSQL是用於複雜查詢關係與條件的環境,資料量較大。

  • 11 # 百家格調

    資料多而且呼叫頻繁的話,用mysql儲存的話資料庫連線被一直佔用,其它的資料請求就進來了,導致連線超時,資料量大的話,資料庫直接宕機了。只能重啟才能解決問題。

    這個時候如果把資料請求量大的資料放在redis中的話就可以分擔一下mysql的壓力,從而提高系統的效能,解決請求併發問題。

  • 12 # 小伍科技

    樓主你好,首先糾正下,資料多並不是一定就用Redis,Redis歸屬於NoSQL資料庫中,其特點擁有高效能讀寫資料速度,主要解決業務效率瓶頸。下面就詳細說下Redis的相比MySQL優點。(關於Redis詳細瞭解參見我近期文章:https://www.toutiao.com/i6543810796214813187/)

    讀寫異常快

    Redis非常快,每秒可執行大約10萬次的讀寫速度。

    豐富的資料型別

    Redis支援豐富的資料型別,有二進位制字串、列表、集合、排序集和雜湊等等。這使得Redis很容易被用來解決各種問題,因為我們知道哪些問題可以更好使用地哪些資料型別來處理解決。

    原子性

    Redis的所有操作都是原子操作,這確保如果兩個客戶端併發訪問,Redis伺服器能接收更新的值。

    豐富實用工具

    Redis是一個多實用工具,可用於多種用例,如:快取,訊息佇列(釋出/訂閱),通知,key值過期等等。

    支援異機主從複製

    Redis支援主從複製的配置,它可以實現主伺服器的完全複製。

    以上為開發者青睞Redis的主要幾個可取之處。但是,請注意實際生產環境中企業都是結合Redis和MySQL的特定進行不同應用場景的取捨。如快取——熱資料、計數器、訊息佇列(與ActiveMQ,RocketMQ等工具類似)、位操作(大資料處理)、分散式鎖與單執行緒機制、最新列表(如新聞列表頁面最新的新聞列表)以及排行榜等等可以看見Redis大顯身手的場景。可是對於嚴謹的資料準確度和複雜的關係型應用MySQL等關係型資料庫依然不可替。

    更多技術瞭解,關注小伍

  • 13 # 語言密碼

    Redis是記憶體資料庫,資料儲存在記憶體中,速度快。

    Mysql是關係型資料庫,資料儲存在磁碟中,資料訪問也就慢。

    redis適合放一些頻繁使用,比較熱的資料,因為是放在記憶體中,讀寫速度都非常快 。

    目前大多數公司的儲存都是mysql + redis,mysql作為主儲存,redis作為輔助儲存被用作快取,加快訪問讀取的速度,提高效能

  • 14 # 小鳥攻城獅

    個人覺得應該站出來更正一下,相反的資料量大,更不應該用redis。為什麼?

    因為redis是記憶體型資料庫啊,是放在記憶體裡的。

    設想一下,假如你的電腦100G的資料,都用redis來儲存,那麼你需要100G以上的記憶體!

    使用場景

    快取

    Redis最明顯的用例之一是將其用作快取。只是儲存熱資料,或者具有過期的cache。

    例如facebook,使用Memcached來作為其會話快取。

    faceboo使用memcached來緩解資料庫負,使用超過800臺伺服器為使用者提供超過28 TB的記憶體。

    佇列

    排行榜/計數

    Pub 釋出/ Sub訂閱

    總之,沒有見過哪個大公司資料量大了,換掉mysql用redis的。

  • 15 # 修普諾斯13

    關係型資料庫是必不可少的,因為只有關係型資料庫才能提供給你各種各樣的查詢方式。如果有一系列的資料會頻繁的查詢,那麼就用redis進行非持久化的儲存,以供查詢使用,是解決併發效能問題的其中一個手段

  • 16 # 1996cdy

    資料量多少絕對不是選擇redis和mysql的準則,因為無論是mysql和redis都可以叢集擴充套件,約束它們的只是硬體(即你有沒有那麼多錢搭建上千個組成的叢集),我個人覺得資料讀取的快慢可能是選擇的標準之一,另外工作中往往是兩者同是使用,因為mysql儲存在硬碟,做持久化儲存,而redis儲存在記憶體中做快取提升效率。

  • 17 # 一個存在感小透明

    題主你錯了,不是用redis代替MySQL,而是引入redis來最佳化。

    BAT裡越來越多的專案組已經採用了redis+MySQL的架構來開發平臺工具。

    如題主所說,當資料多的時候,MySQL的查詢效率會大打折扣。我們通常預設如果查詢的欄位包含索引的話,返回是毫秒級別的。但是在實際工作中,我曾經遇到過一張包含10個欄位的表,1800萬+條資料,當某種場景下,我們不得不根據一個未加索引的欄位進行精確查詢的時候,單條sql語句的執行時長有時能夠達到2min以上,就更別提如果用like這種模糊查詢的話,其效率將會多麼低下。

    經過一番調研,最終敲定的解決方案是引入redis作為快取。redis具有執行效率高,資料查詢速度快,支援多種儲存型別以及事務等優勢,我們把經常讀取,而不經常改動的資料放入redis中,伺服器讀取這類資料的時候時候,直接與redis通訊,極大的緩解了MySQL的壓力。

    然而,我在上面也說了,是redis+MySQL結合的方式,而不是替代。原因就是redis雖然讀寫很快,但是不適合做資料持久層,主要原因是使用redis做資料落盤是要以效率作為代價的,即每隔制定的時間,redis就要去進行資料備份/落盤,這對於單執行緒的它來說,勢必會因“分心”而影響效率,結果得不償失。

  • 18 # 會點程式碼的大叔

    通常來說,當資料多、併發量大的時候,架構中可以引入Redis,幫助提升架構的整體效能,減少Mysql(或其他資料庫)的壓力,但不是使用Redis,就不用MySQL。

    因為Redis的效能十分優越,可以支援每秒十幾萬此的讀/寫操作,並且它還支援持久化、叢集部署、分散式、主從同步等,Redis在高併發的場景下資料的安全和一致性,所以它經常用於兩個場景:

    經常被查詢,實時性要求不高資料,比如網站的最新列表、排行榜之類的資料,只需要定時統計一次,然後把統計結果放到Redis中提供查詢(請不要使用select top 10 from xxxx)。

    快取可以方便資料共享,比如我先用電腦網頁開啟X東,選了兩件商品放到購物車裡面,再登入手機APP,也是可以看到購物車裡面的商品的。

    判斷資料是否適合快取到Redis中,可以從幾個方面考慮:會經常查詢麼?命中率如何?寫操作多麼?資料大小?

    我們經常採用這樣的方式將資料刷到Redis中:查詢的請求過來,現在Redis中查詢,如果查詢不到,就查詢資料庫拿到資料,再放到快取中,這樣第二次相同的查詢請求過來,就可以直接在Redis中拿到資料;不過要注意【快取穿透】的問題。

    快取的重新整理會比較複雜,通常是修改完資料庫之後,還需要對Redis中的資料進行操作;程式碼很簡單,但是需要保證這兩步為同一事務,或最終的事務一致性。

    高速讀寫

    常見的就是計數器,比如一篇文章的閱讀量,不可能每一次閱讀就在資料庫裡面update一次。

    高併發的場景很適合使用Redis,比如雙11秒殺,庫存一共就一千件,到了秒殺的時間,通常會在極為短暫的時間內,有數萬級的請求達到伺服器,如果使用資料庫的話,很可能在這一瞬間造成資料庫的崩潰,所以通常會使用Redis(秒殺的場景會比較複雜,Redis只是其中之一,例如如果請求超過某個數量的時候,多餘的請求就會被限流)。

    這種高併發的場景,是當請求達到伺服器的時候,直接在Redis上讀寫,請求不會訪問到資料庫;程式會在合適的時間,比如一千件庫存都被秒殺,再將資料批次寫到資料庫中。

    所以通常來說,在必要的時候引入Redis,可以減少MySQL(或其他)資料庫的壓力,兩者不是替代的關係。

  • 19 # 加瓦攻城獅

    這種做法當然都是為了最佳化、特別是資料量大的時候用來減少資料庫的壓力。這是高併發網站常用的一種策略。

    為什麼使用Redis是因為它是非關係型資料庫,讀寫較快比較適合用來做快取!

    望採納!

  • 20 # 西安石頭石頭

    這兩種資料庫實現相輔相成的關係,不存在排斥關係

    首先mysql是持久化資料庫,是關係型資料庫,是直接儲存在硬碟上的

    redis是非關係型資料庫,是記憶體執行的資料儲存獲取工具

    顯而易見,在記憶體中執行和在硬碟的IO執行,速度完全不是一個級別的

    那為什麼現在大家都喜歡用redis呢?

    原因很簡單,就是處理資料速度快,所有很多的專案尤其是在併發量比較大的時候,都是在Redis中完成資料的處理之後,在將結果統一執行儲存在持久化資料庫Mysql中,Mysql基本支援千萬級別的資料沒有問題,但是在併發量大的情況下,負載壓力非常大,很容易佔用過多資源,導致資料庫本身或者服務宕機,在這種情況下,將資料的處理放在記憶體中,用Redis來處理,處理完成之後再講結果儲存到Mysql中,就成為了大多數專案的優先選擇

  • 中秋節和大豐收的關聯?
  • 女人為什麼要嫁人?