Redis本身是支持數據持久化的,很多有些程序員都會覺得Redis應該可以替代MySQL,但是我們在使用一項技術的時候,不是看它能不能,而是要看它適合不適合;而在大部分場景下,Redis是無法替代MySQL的。

  • MySQL是關係型資料庫,數據儲存在磁碟上,數據的格式是我們熟知的二維表格的樣式。關係型資料庫具有很多強大的功能;大部分都支持SQL語句查詢,對事務也有很好的支持。

  • Redis被稱作非關係型資料庫,屬於內存資料庫,數據都儲存在內存中(Redis有RDB持久化策略),Redis支持的數據類型也比較多,比如字元串,HASH,List等。

  • MySQL和Redis沒有競爭的關係,通常當並發訪問量比較大的時候,特別是讀操作很多,架構中可以引入Redis,幫助提升架構的整體性能,減少Mysql(或其他關係型資料庫)的壓力;

  • 不是MySQL or Redis;而是MySQL + Redis ;

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

  1. 經常要被查詢,但是CUD操作頻率低的數據;比如數據字典,確定了之後很少被修改,是可以放到緩存中的;還有熱點數據,查詢極為頻繁的數據,放到Redis中可以減少MySQL的壓力;

  2. 經常被查詢,但是實時性要求不高數據,比如購物網站的熱銷排行榜,定時統計一次後把統計結果放到Redis中提供查詢(請不要每次都使用select top 10 from xxxx)。

  3. 緩存還可以做數據共享(Session共享),在分散式的架構中,把用戶的Session數據放到Redis中。

  4. 高並發場景下的計數器,比如秒殺,把商品庫存數量放到Redis中(秒殺的場景會比較複雜,Redis只是其中之一,例如如果請求超過某個數量的時候,多餘的請求就會被限流);

  5. 因為Redis對高並發的支持和單線程機智,它也經常用作分散式鎖;

Redis雖然功能強大、性能高效,但是也不是萬能的,項目在引入Redis的時候,需要考慮的問題也比較多,並且會帶來額外的開發和運維的工作量。

  1. 首先要判斷數據是否適合緩存到Redis中,可以從幾個方面考慮:數據會被經常查詢麼?命中率如何?寫操作多麼?數據大小?數據一致性如何保證?

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

  3. 緩存的刷新會比較複雜,通常是修改完資料庫之後,還需要對Redis中的數據進行操作;代碼很簡單,但是需要保證這兩步為同一事務,或最終的事務一致性。

我將持續分享Java開發、架構設計、程序員職業發展等方面的見解,希望能得到你的關注。


redis是不可以代替mysql進行數據存儲的。redis和mysql不應該是競爭的關係,而是一對好基友。在實際工作中針對不同的場景,根據redis和mysql的各自優點採用不同的存儲方案,合理的運用兩者才能達到理想的效果。

NoSQL是「Not Only SQL」的意思,本質上是跟SQL形成互補關係的應用。

之所以有「redis是否可以代替mysql進行數據存儲」這樣的疑問,一定是有很多人認為redis是可以替代mysql的。我也不可否認,在特定的場景下或者說小型web服務的場景下,redis確實可以替代mysql做數據存儲。但是這是有前提條件的,絕不能就可以說redis可以代替mysql進行數據存儲的。

Redis is an open source (BSD licensed), in-memory data structure store, used as a database, cache and message broker. It supports data structures such as strings, hashes, lists, sets, sorted sets with range queries, bitmaps, hyperloglogs, geospatial indexes with radius queries and streams. Redis has built-in replication, Lua scripting, LRU eviction, transactions and different levels of on-disk persistence, and provides high availability via Redis Sentinel and automatic partitioning with Redis Cluster.

上面是redis的官網描述,redis是一個基於BSD協議開源的內存資料庫,可用作資料庫、緩存和消息隊列,支持strings、hashes、lists、sets、sorted sets、bitmaps...等等數據結構。

每一種數據結構都有適合自己的應用場景,熟悉運用redis的各種數據結構,確實讓各位有一種錯覺「redis可以替代mysql」。

redis是基於內存存儲的,採用IO單路復用模型。一個字就是快!對於並發訪問量比較高的場景,使用redis可以避免流量直接沖向資料庫層。


下面是個人使用redis和mysql的一些心得:

  1. redis存業務數據,mysql存更細粒度或者基於數據模型對象的數據,redis是中間緩存層,mysql是數據存儲層。

  2. mysql中like/in/and/or/join等數據查詢檢索redis是無法支持的,通常情況下,我們會以mysql數據為基礎數據,然後通過一系列的策略或者job跑出業務數據放到redis中存儲,這是二者結合使用的典型應用場景。

  3. redis對事務的支持還是比較簡單的,所以很多複雜的數據落庫場景很難用redis去支持,即便可以支持,那也需要花費高昂的代價,這個時候你突然想起來有一個mysql好像可以完美的支持事務。

  4. 大部分的業務請求基本上就到redis這一層就結束了,如果查不到數據那就查不到,不會再去資料庫裡面去查了,所以也不用考慮「緩存穿透」的問題。

  5. redis中存儲的大部分數據是不過期的,所以也沒有「緩存雪崩」的問題。

  6. redis能夠讓你的業務運行的更快,mysql能夠讓你的數據更安全。

  7. 那麼問題來了,如何保證redis中存儲的業務數據能夠與mysql中存儲的數據保持一致呢?所以我們需要做一套數據一致性的方案來保證這個前提。


綜上,MySQL和redis各自有各自的應用場景,掌握好他們的特性,在不同的場景下應用最適合的存儲方案纔是編碼之道。

歡迎大家積極參與討論,一起學習,共同成長~


首先可以明確一點的是:Redis可以對MySQL中的部分數據進行存儲,但Redis是無法代替MySQL來做數據存儲的。Redis是非關係型資料庫,MySQL是關係型資料庫,聽上去都是資料庫,但兩者的定位及應用場景是完全不同的。

資料庫的目的及功能

資料庫是專門用來存儲數據的地方,可以理解成是一個電子檔案館。資料庫需要具備最基本的新增、更新、查詢、刪除等操作,另外要在並發操作下保證數據的隔離性和一致性。

為什麼會存在非關係型資料庫(NoSQL)?

我們知道,傳統的關係型資料庫都是持久化存儲的,數據是存放在硬碟中的。隨著數據量的擴大,無論是寫入還是查詢操作都會產生IO開銷。為瞭解決寫讀數據帶來的IO瓶頸就出現了NoSQL技術。

Redis非關係型資料庫的初衷及不足

Redis作為一種非關係型資料庫的代表,它是基於內存的高性能Key-Value資料庫。它支持每秒十幾萬次的讀寫操作,在讀寫性能上遠遠超過傳統的關係型資料庫。

Redis讀寫速度之所以這麼快,是因為它將數據直接存放在內存中進行操作的。但是問題也來了,如果使用Redis來做數據存儲,那內存開銷是相當大的,出於成本考慮我們一般只使用Redis來存儲熱點數據。

另外一方面,雖然Redis也支持數據持久化,但是Redis的數據查詢能力很差而且事務支持不完善。這樣一比較,在數據存儲能力上,Redis遠遠比不上MySQL這類關係型資料庫。


綜上,Redis一般都是配合MySQL來使用的,也無法代替MySQL來做數據持久存儲。

以上就是我的觀點,對於這個問題大家是怎麼看待的呢?歡迎在下方評論區交流 ~ 我是科技領域創作者,十年互聯網從業經驗,歡迎關注我瞭解更多科技知識!


這個完全取決於你對數據的要求,是否允許丟失,還是必須要求不允許丟失。我覺得就可以直接存放redis.如果用戶去網站買東西,這時候要記錄用戶的一個在網站操作的操作行為,(看了哪個商品、點擊了哪個商品、點擊了哪個按鈕)日誌,可以用來還原當時用戶的操作行為這個日誌的記錄是可以放在redis的,但是用戶下單、支付、配送信息等這些是要保持強一致性,並且不允許丟失的所以需要存入mysql.當用戶下完單之後想看下自己的訂單詳情,這時候訂單詳情一些固定的信息也是可以放redis的,所以redis和mysql是可以結合一起使用的。什麼事情都沒有絕對的,完全取決於你的業務要求。是業務驅動技術。


不可以!redis是nosql資料庫,內存型,單線程,運行時數據暫存內存,而資料庫數據是存放在硬碟!雖然有rdb、aof兩種持久化,但也只是為了避免掉電數據丟失,而且內存容量也有限,並不能解決資料庫的大量數據的持久化,更重要的是,redis雖然也支持事務,但不支持資料庫的事務回滾機制,不具有任何維持原子性的機制,雖然也因為單線程的原因有原子性,但不具有資料庫的原子性一致性隔離性持久性!


Mysql是關係型資料庫,而NOSQL譬如redis通常都是弱關係,如果你的數據相互之間關係非常弱,哪自然可以使用redis,反之如果你是強關係,使用redis則需要自己實現上層的數據模型關係,祝你好運


可以,但是成本翻百倍,大型項目以TB為數據容量單位的。而且至少需要雙熱備,成本翻倍


不可以,redis存儲在緩存空間臨時性的,mysql存儲在磁碟空間永久性的。


不可以,存儲數據類型不一樣,都是開源資料庫,用redis 代替mysql沒意義


推薦閱讀:
相關文章