ps :讀書筆記css
緩存就是把從數據庫中的數據暫時存起來,下次使用時無需在查詢數據庫。緩存分爲程序直接保存到內存和框架框架2種。程序緩存通常使用currentHashMap直接保存到內存。框架緩存的話有redis,memcache等。
ps:空數據值問題。
緩存建立的時候把沒有數據的緩存用特定的符號來表示。由於這種模式下若是從緩存中獲取不到數據,就會查詢數據庫,可是其自己就沒有數據的話。那麼每次都要查詢一次數據庫,不合理。
頁面靜態化:是將程序生成的頁面保存起來。這樣下次調用直接就使用。連程序這一關也過了。更加快速。能夠在程序中使用velocity等技術來生成靜態頁面,也能夠經過上層緩存Nginx來生成。前端
1.表結構優化:設計合理的符合規範的表。
2.sql優化:根據日誌以及其餘工具分析那條sql語句最耗時,在針對性的有的放矢的優化,要統籌好,不能只針對一條語句,優化時要考慮到表上的其餘語句綜合考慮。
3.分區:一個表中數據量太大時,那麼分區就可使用了。分區是將數據按照必定規則把數據分到不一樣區來保存,這樣子操做數據時,數據量更少。查詢數據時只在必定區間進行。且這種操做時對程序透明的。程序無需修改。
4.分表:分表就是把表橫向切分爲幾個表。第一種方式就是爲了減小數據,好比一張表裏面某個字段是分類。能夠更具這個分類來分爲多個表。以此來減小每一個表的數據量。第二種方式是因爲某個表某些字段常常被查,可是不修改,某些字段須要進場修改,那麼分表是個不錯的選擇,由於對於mysql之類的表來講,增刪改操做時要加鎖的,不管是什麼隔離級別。,這樣子加鎖範圍就減小了。對於mysql來講不是問題,可是對於其餘數據庫來講就不知道了。對於mysql來講能夠照樣讀取數據,對於某些數據庫或者se隔離級別的mysql,這條記錄也是不可讀的。須要等待數據庫釋放這條記錄的鎖。
5.索引優化:對於mysql的innodb來講,我上篇博客已經說過了。這裏簡單說下,最左匹配原則,綜合全部查詢語句,找出,最佳的索引建立原則和最佳的查詢語句,好比,你有聯合索引(a,b,c)。你的查詢語句爲b=1 and c=1 那麼要麼調整查詢語句讓其條件多個a=?要麼聯合索引(a,b,c)調整爲(b,c,a)。其次對於mysql來講。一條語句有且只用一個表有且只用一條索引。至於多表查詢時連表的語句也會加入到索引裏面。
6.存儲過程:對於複雜的sql來講來講,直接使用存儲過程來調用,能夠有效提升效率。mysql
一個數據量很大的表,只有一小部分數據是活躍數據,常常被查詢,更多的數據則是惰性數據,偶爾被調用一下。那麼咱們能夠用2個表來保存,第一個表是活躍數據保存,第二個表是惰性數據保存。這樣子能夠有效提升效率。至因而否活躍數據,怎麼分配就要看本身方業務邏輯怎麼實現的了。ajax
1.批量讀取:故名思議,把一堆查詢結合成一條查詢,好比。有的業務是要查詢一次作個操做,那麼能夠把這些查詢放在一個in()語句裏面。又或者高併發下,把幾秒的異步請求統一查詢處理。
2.延遲修改:就是把一些頻繁修改的數據放到一個緩存裏面去,而後定時把緩存的數據刷到數據庫裏面,這個緩存和普通緩存不同,這個緩存的數據庫不是完整的。程序查詢時同時讀取數據庫和緩存的數據,綜合讀取之。redis
先上一張圖,這個圖是書裏面的,提及來很簡單就是把讀取數據和增刪改數據分離到不一樣數據庫裏面。增刪改放到主數據庫裏面,讀取數據則是放到從數據庫裏面。主數據的數據經過底層同步到從數據庫裏面。sql
分佈式數據庫是將不一樣的表放到不一樣的數據庫裏面,而後再放到不一樣的服務器裏面,這樣子查詢時可使用多臺服務器來運行,能夠有效提升效率,主要用於超複雜耗時的查詢。這個能夠和讀寫分離一塊兒使用,搭配使用。另外一種狀況是不一樣業務的表放在不一樣數據庫裏面,能夠起到分流的做用數據庫
NoSql和sql比起來就是非結構化的,就是沒有定義好的字段,類型啊之類的,可是NOsql是經過多個塊存儲數據,所以效率速度很快,被普遍應用於大數據
Hadoop:Hadoop是針對大數據處理的一套框架。瀏覽器
這個是Hadoop存儲圖,就是把表的數據塊分爲多個節點保存。這樣子能夠併發處理而且能夠保存數據的穩定性。Hadoop是對每個數據塊找到的節點並處理,而後在統一處理,獲得最終結果(這塊不熟)緩存
就是將圖片,視頻,css,等文件保存到另一個服務器中,使用2級域名,經過不一樣域名,可讓瀏覽器迅速獲取到資源而不用訪問應用服務器。服務器
就是將程序生成的頁面緩存保存下來,下次訪問時就不用再用cpu來生成數據了。浪費其資源。可使用Nginx服務器自帶的緩存機制,也可使用專門的squid來處理。(ps:對於一些頁面某些數據常常變化,可是總體不變,那麼咱們可使用ajax來請求從新獲取數據來更新界面)
集羣就是相同的程序放到多個服務器裏面,主要起到分流的做用。分佈式就是更具業務邏輯將程序拆分到不一樣服務器上。這2個能夠一塊兒使用。(至於集羣致使的session和token問題,下一章會有篇關於session和token)。不用業務之間的聯繫能夠經過RPC來處理,咱們這邊業務較爲複雜,將大量的程序拆分紅一個個的微服務。每一個微服務之間經過dubbo來傳遞消息。
反向代理:就是客戶端訪問的服務器不直接提供資源,該服務器從別的服務器獲取資源並返回給用戶主要由3個做用
1.能夠負載均衡
2.能夠轉發請求
3.能夠做爲前端服務器和實際請求服務器集成。
ps:反向代理和代理服務器不同。反向代理是用戶不知道這個事,一切都是透明的。代理服務器則是用於代替用戶獲取資源在返回給用戶,須要用戶手動設置。
CDN是個特殊的頁面緩存服務器,和普通的服務器相比,CDN服務器遍及全國各地,當接受到用戶請求時,會將其分配到對應的最合適節點,根據地域等信息來分配,如圖所示爲其中一個實現方式。