高併發系統設計十-數據庫成爲瓶頸後,動態數據的查詢如何加速(引入緩存)

緩存:數據庫成爲瓶頸後,動態數據的查詢如何加速

在高併發大流量下,數據庫層的演進過程、分庫分表設計上的分析,基本可以支持十幾萬的 DAU (DAU(Daily Active User)日活躍用戶數量)了。但是隨着併發的增加,存儲數據量的增多,數據庫的磁盤 IO 逐漸成了系統的瓶頸,這個時候就需要使用緩存,來降低請求響應時間,提升系統的性能。

1、緩存的定義

存儲數據的組件,作用是讓對數據的請求更快地返回。

我們使用內存作爲還貸存儲介質相比較以磁盤作爲主要存儲介質的數據庫來說,性能上會提高多個數量級,同時也能夠支撐更高的併發量,所以內存是常用的一種緩存數據的介質。

2、緩存的分類

常見的緩存主要就是靜態緩存、分佈式緩存、熱點本地緩存

2.1、靜態緩存

靜態緩存在 Web 1.0 時期是非常著名的,它一般通過生成 Velocity 模板或者靜態 HTML 文件來實現靜態緩存,在 Nginx 上部署靜態緩存可以減少對於後臺應用服務器的壓力。

比如做內容管理系統時,後臺錄入很多文章,前臺在網站上展示文章內容,像新浪、網易這類門戶網站。

每篇文章在錄入的時候渲染成靜態頁面,放置在所有的前端 Nginx 或者 Squid 等 Web 服務器上,這樣用戶在訪問的時候會優先訪問 Web 服務器上的靜態頁面。

2.2、分佈式緩存

Memcached、Redis 就是分佈式緩存

2.3、熱點本地緩存

熱點本地緩存主要部署在應用服務器的代碼中,用於阻擋熱點查詢對於分佈式緩存節點或者數據庫的壓力。

那麼我們會在代碼中使用一些本地緩存方案,如 HashMap,Guava Cache 或者是 Ehcache 等,它們和應用程序部署在同一個進程中,優勢是不需要跨網絡調度,速度極快,所以可以用來阻擋短時間內的熱點查詢。

由於本地緩存是部署在應用服務器中,而我們應用服務器通常會部署多臺,當數據更新時,我們不能確定哪臺服務器本地中了緩存,更新或者刪除所有服務器的緩存不是一個好的選擇,所以我們通常會等待緩存過期。因此,這種緩存的有效期很短,通常爲分鐘或者秒級別,以避免返回前端髒數據。

3、緩存的優勢劣勢

  • 緩存比較適合於讀多寫少的業務場景,並且數據最好帶有一定的熱點屬性,數據有熱點屬性時才能保證一定的緩存命中率

  • 緩存會給整體系統帶來複雜度,並且會有數據不一致的風險

    在更新數據庫成功,更新緩存失敗的情況下,緩存中就會存在髒數據,對於這類問題,可以使用較短的過期時間或者手動清理的方式來解決

  • 之前提到緩存通常使用內存作爲存儲介質,但是內存並不是無限的。對於消耗極大內存的數據,要慎用緩存方案,同時緩存一定要設置過期時間,剔除非熱點數據。

  • 緩存會給運維也帶來一定的成本

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章