日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

给数据库减负的八个思路

發(fā)布時間:2025/3/16 数据库 15 豆豆
生活随笔 收集整理的這篇文章主要介紹了 给数据库减负的八个思路 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

傳統(tǒng)的企業(yè)級應用,其實很少會有海量應用,因為企業(yè)的規(guī)模本身就擺在那里,能有多少數(shù)據(jù)?高并發(fā)?海量數(shù)據(jù)?不存在的!

不過在互聯(lián)網(wǎng)公司中,因為應用大多是面向廣大人民群眾,數(shù)據(jù)量動輒上千萬上億,那么這些海量數(shù)據(jù)要怎么存儲?光靠數(shù)據(jù)庫嗎?肯定不是。

今天松哥和大家簡單的聊一聊這個話題。

海量數(shù)據(jù),光用數(shù)據(jù)庫肯定是沒法搞定的,即使不讀松哥這篇文章,相信大家也能凝聚這樣的共識,海量數(shù)據(jù),不是說一種方案、兩種方案就能搞定,它是一攬子方案。那么這一攬子方案都包含哪些東西呢?松哥從以下八個方面來和大家聊聊。


1.緩存

首先第一種解決方案就是緩存了。

緩存,我們可以將數(shù)據(jù)直接緩存在內從中,例如 Map、也可以使用緩存框架如 Redis 等,將一些需要頻繁使用的熱點數(shù)據(jù)保存在緩存中,每當用戶來訪問的時候,就可以直接將緩存中的數(shù)據(jù)返回給用戶,這樣可以有效降低服務器的壓力。

可以緩存起來使用的數(shù)據(jù),一般都不能對實時性要求太高。


2.頁面靜態(tài)化

頁面靜態(tài)化其實可以算作是緩存的另外一種形式,相當于直接將相關的頁面渲染結果緩存起來。首先大家知道,在我們的 Web 項目中,資源分為兩大類:

  • 靜態(tài)資源

  • 動態(tài)資源

靜態(tài)資源就是我們常見的 HTML、CSS、JavaScript、圖片等資源,這些資源可以不經(jīng)過服務端處理,就可以直接返回給前端瀏覽器,瀏覽器就可以直接顯示出來。

動態(tài)資源則是指我們項目中的 Servlet 接口、Jsp 文件、Freemarker 等,這些需要經(jīng)過服務端渲染之后,才可以返回前端的資源。

在實際項目中,靜態(tài)資源的訪問速度要遠遠高于動態(tài)資源,動態(tài)資源往往很容易遇到服務器瓶頸、數(shù)據(jù)庫瓶頸,因此,對于一些不經(jīng)常更新的頁面,或者說更新比較緩慢的頁面,我們可以通過頁面靜態(tài)化,將一個動態(tài)資源保存為靜態(tài)資源,這樣當服務端需要訪問的時候,直接將靜態(tài)資源返回,就可以避免去操作數(shù)據(jù)庫了,降低數(shù)據(jù)庫的壓力。

例如松哥以前做過的一個電商項目,系統(tǒng)根據(jù)大數(shù)據(jù)統(tǒng)計,自動統(tǒng)計出用戶當前搜索的熱點商品,這些熱點商品,10 分鐘更新一次,也就是說,在十分鐘內,用戶登錄上來看到的熱點商品都是相同的。那么就沒有必要每次都去查詢數(shù)據(jù)庫,而是將熱點數(shù)據(jù)的頁面,通過輸出流自動寫到服務器上,寫成一個普通的 HTML 文件,下次用戶來訪問,在 10 分鐘有效期內,直接將 HTML 頁面返回給用戶,就不必操作數(shù)據(jù)庫了。

一般來說,Freemarker、Velocity 等都有相關的方法可以幫助我們快速將動態(tài)頁面生成靜態(tài)頁面。

這就是頁面靜態(tài)化。


3.數(shù)據(jù)庫優(yōu)化

很多時候程序跑得慢,不是因為設備落后,而是因為數(shù)據(jù)庫 SQL 寫的太差勁。

要解決海量數(shù)據(jù)的問題,數(shù)據(jù)庫優(yōu)化肯定也是不可避免的。一般來說,我們可以從 SQL 優(yōu)化、表結構優(yōu)化、以及數(shù)據(jù)庫分區(qū)分表等多個方面來對數(shù)據(jù)庫進行優(yōu)化。數(shù)據(jù)庫優(yōu)化其實也是一門巨大的學問,松哥以后看有時間寫個連載和大家仔細聊聊這個話題。


4.熱點數(shù)據(jù)分離

數(shù)據(jù)庫中的數(shù)據(jù),雖然是海量數(shù)據(jù),但是這些數(shù)據(jù)并不見得所有數(shù)據(jù)都是活躍數(shù)據(jù),例如用戶注冊,有的用戶注冊完就消失的無影無蹤了,而有的用戶則在不停的登錄,因此,對于這兩種不同的用戶,我們可以將活躍用戶分離出來,在主要操作的數(shù)據(jù)表中只保存活躍用戶數(shù)據(jù)。每次用戶登錄,先去主表中查看有沒有記錄,有的話,直接登錄,沒有的話,再去查看其他表。

通過判斷用戶在某一段時間內的登錄次數(shù),就可以很快分離出熱點數(shù)據(jù)。


5.合并數(shù)據(jù)庫操作

這個方案的宗旨其實是減少數(shù)據(jù)庫操作的次數(shù),例如多次插入操作,我們可以合并成一條 SQL 搞定。多個不同條件的查詢,如果條件允許的話,也可以合并成為一個查詢,盡量減少數(shù)據(jù)庫的操作,減少在網(wǎng)絡上消耗,同時也降低數(shù)據(jù)庫的壓力。


6.數(shù)據(jù)庫讀寫分離

數(shù)據(jù)庫的讀寫分離其實松哥在之前的 MyCat 中也和大伙聊過了(MyCat 系列),讀寫分離之后,一方面可以提高數(shù)據(jù)庫的操作效率,另一方面也算是對數(shù)據(jù)庫的一個備份。這一塊的具體操作大家可以參考松哥前面的文章。


7.分布式數(shù)據(jù)庫

數(shù)據(jù)庫讀寫分離之后,無形中增大了代碼的復雜度,所以一般還需要借助分布式數(shù)據(jù)庫中間件,這樣可以有效提高數(shù)據(jù)庫的彈性,可以方便的隨時為數(shù)據(jù)庫擴容,同時也降低代碼的耦合度。


8.NoSQL 和 Hadoop

另外,引入 NoSQL 和 Hadoop 也是解決方案之一。NoSQL 突破了關系型數(shù)據(jù)庫中對表結構、字段等定義的條條框框,使用戶可以非常靈活方便的操作,另外 NoSQL 通過多個存儲塊存儲數(shù)據(jù)的特點,使得天然具備操作大數(shù)據(jù)的優(yōu)勢(快)。不過,老實說,NoSQL 目前還是在互聯(lián)網(wǎng)項目中比較常見,在傳統(tǒng)的企業(yè)級應用中還是比較少見。

Hadoop 就不必說了,大數(shù)據(jù)處理利器。

很多時候技術和架構只是一個工具,所有的東西都擺在你面前,關鍵是如何把這些東西組合在一起,使之產(chǎn)生最大化收益,這就需要大家慢慢琢磨,松哥后面也盡量和大家多分享一些這方面的經(jīng)驗。

好了,簡單的從 8 個方面和大家聊一聊這個問題,大家在工作中有沒有遇到類似問題呢?你都是怎么處理的?歡迎留言討論。

參考資料:

[1] 韓路彪.看透Spring MVC:源代碼分析與實踐[M].北京:機械工業(yè)出版社,2015.

有道無術,術可成;有術無道,止于術

歡迎大家關注Java之道公眾號

好文章,我在看??

新人創(chuàng)作打卡挑戰(zhàn)賽發(fā)博客就能抽獎!定制產(chǎn)品紅包拿不停!

總結

以上是生活随笔為你收集整理的给数据库减负的八个思路的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內容還不錯,歡迎將生活随笔推薦給好友。