當前位置:
首頁 > 最新 > 資料庫歷險記(三)

資料庫歷險記(三)

最近在思考資料庫以及緩存的問題,發現這些知識點其實是有一點關聯的,於是這篇文章通過一個連環提問的方式將這些知識點串聯起來。

問:為什麼要用 Memcached、Redis,直接用 MySQL 這些資料庫不好嗎?

答:因為 MySQL 等關係型資料庫無法承受巨大的資料庫訪問量。

問:為什麼 MySQL 資料庫無法承受巨大的訪問量,而 Redis Memcached 卻可以?

因為 MySQL 使用文件去存儲數據,這就意味著它的查詢和寫入速度受限於硬碟的速度。雖然 MySQL 也使用了內存緩存一部分數據,但這隻能減少一部分的查詢請求,如果查詢請求數變多,同樣會到達硬碟的 IO 瓶頸。

另一方面,關係型資料庫為了實現數據的強一致性,在每次寫入數據的時候會對相關的數據進行加鎖操作,這樣就導致在某個時刻,相關的數據只能有一個線程在操作,這樣也從某種程度上限制了 MySQL 的讀寫性能。

如果此時查詢緩存並沒有相關數據,那麼還會有一部分 IO 等待的事件,從而導致加鎖時間變長。

而 Redis、Memcached 之所以能夠承受得住 MySQL 無法承受的海量查詢,很大程度上是因為他們將所有數據都存在了內存中,所以它們並不需要進行 IO 等待,直接可以從內存中查詢數據並返回。

而內存的讀取效率則是硬碟的 40 倍左右,存儲介質的巨大區別導致了他們的應用特性。

問:那有了 Memcached 不就好了嗎,為什麼還要用 Redis 呢?

答:這就要說到這兩種緩存的發展歷史了。一開始是 2003 年發布的,一開始是為了解決資料庫的讀寫瓶頸問題,於是將一些熱點數據存儲在內存中,從而有了 Memcached。

但經過幾年的使用,人們發現 Memcached 存在一些問題,例如 Memcached 只支持 Key - Value 的字元串數據存儲,Memcached 無法持久化數據,一旦重啟伺服器數據便丟失了。

出於這些原因,2009 年一些工程師在 Memcached 的基礎之上打造了 Redis 框架,它與 Memcached 相比,支持更多的數據類型存儲,例如:String, List, Set, SortedSet, Hash 等。此外還支持將存儲在內存中的數據持久化到文件中,從而實現數據持久化。

另外 Redis 支持更大的數據存儲,key-value 的存儲大小可達 512M,而 Memcached 的 key 大小只有 512KB,而 value 則只有 1 M 大小。

另外它還支持許多的原子操作。因為 Redis 與 Memcached 相比有上述的優點,所以現在越來越多的人開始使用 Redis 作為緩存框架。

問:但按我所知,現在還是有許多公司使用 Memcached 作為緩存框架。換句話說,你覺得什麼時候應該使用 Memcached,什麼時候應該使用 Redis?

答:首先,無論 Redis 還是 Memcached,它們都是一個 NoSQL 資料庫,並且都將所有數據存在內存中。現在確實有些公司還是使用 Memcached 框架作為緩存,Memcached 在某些方面確實比 Redis 好一些,雖然這些優勢非常小。

例如 Memcached 在處理小數據量靜態數據的速度會非常快,但是一旦數據量變大或者數據變動頻繁,那 Memcached 的處理速度就會急劇下降。

另外一個 Memcached 的優勢是 Memcached 是多線程的,所以如果你想提高 Memcached的性能,你可以直接給它換一個性能更加強勁的 CPU 就可以。

但是對於 Redis 而言,因為 Redis 是單線程的,所以如果你想提升 Redis 的處理能力,那麼你只能多部署一台 Redis 伺服器,這比起 Memcached 來說比較麻煩。

總結來說,Memcached 比起 Redis 來說,只有小數據量存儲以及橫向拓展這兩個方面能勉強說得上「優勢」,但其實 Redis 也能做得同樣好,甚至超過它,只不過是需要花多點學習成本而已。

所以,如果你之前已經非常了解 Memcached 了,花了很多時間學習 Memcached 的知識,那麼你可以選擇 Memcached。

否則選擇 Redis 是一個更好的選擇,因為所有 Memcached 能做的,Redis 也能做,而且 Redis 能做到更多 Memcached 無法做到的事情。

問:那 Redis 除了作為緩存之外,還有其他什麼作用嗎?

答:作為緩存可能是 Redis 最廣為人知的作用吧,但 Redis 除了作為緩存,還能作為消息隊列解決方案、分散式鎖等。

問:那 MongoDb 與 Redis 相比有什麼優勢可言,它更適用於什麼場景呢?

答:MongoDb 的出現與 Redis 的出現類似,都是用來解決 MySQL 無法實現海量訪問而存在的。但 Redis 僅僅是一個 key-value 的緩存系統,其幾乎沒有任何資料庫特性,在那些許多進行查詢的場景中,redis 無法勝任。

在這個時候 MongoDb 憑藉其出色和豐富的查詢功能脫穎而出。

另外 MongoDb 也能存儲比 MySQL 更加大量的數據。MongoDb 適合那種數據結構經常變化,數據之間沒有聯繫,這種場景適合用 MongoDb,例如多重嵌套的留言回復。

如果覺得文章還不錯,記得點贊評論轉發哦。


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 陳樹義 的精彩文章:

TAG:陳樹義 |