1. 程式人生 > >高併發處理的方法

高併發處理的方法

高併發有很多方面   主要從伺服器  資料庫  和快取方面解決

一 伺服器

    1‘搭建叢集 

    2 你nginx負載均衡   nginx實現負載均衡有四種方法 

       1)輪詢演算法  (就是每個伺服器交替處理)

       2)weight 權重方法  預設權重為1  根據伺服器的執行速度分配權重

       3)ip_hash 根據使用者的ip地址  給伺服器設定相應地址  不同地區的訪問相應地區的伺服器

      4)       根據資料的訪問時間  空閒伺服器優先選擇

   3 cdn 節點

     cdn網路節點 可以減少使用者對主伺服器的訪問  在cdn中會有大量的靜態資源以及不常改變的資源資料  cdn會有定時一段時間後向主伺服器更新資源資訊

二,資料庫

   1  優化資料庫  新增索引  索引分為普通索引(加速查詢)唯一索引  (加速查詢 而且列值為唯一值  可以為null) 主鍵索引( 加速查詢  列值唯一  但不可以為null 每個表只能一個主鍵索引) 組合索引 多列值組成一個索引  專門用於組合查詢搜尋  其效率大於索引合併   全文索引  對文體的內容進行分詞,進行搜尋    

   在對資料表進行查詢時儘量不對null進行查詢 還有少用 !<>查詢  這會是索引失效  進行全域性搜尋

  2 mycat 中介軟體對資料庫進行讀寫分離   一般至少兩個  主負責寫  從 負責讀  如果從宕機可以重啟  再重新在主裡複製  如果主宕機要先把從升級為主在重啟

 3  資料庫的分庫分表  同庫分表  所有表在同一個資料庫中 名字不能相同 要修改表面  優點由於都在同一資料庫 公共表不用複製   缺點  資料庫的cpu  檔案IO 記憶體  網路IO的瓶頸都無法解決  只能降低表中的資料記錄數。   異庫分表  因為庫不同 所有名字可以一樣  優先  可以解決 cpu  記憶體  檔案IO  網路IO 的瓶頸問題  而且表名相同  處理簡單  缺點  公共表在所有的分表都要使用 所以要進行同步複製  修改也要同步

三、快取 

    redis是最常用的快取  把專案中經常被訪問的書籍存入快取  減少對資料庫的訪問

       redis 的持久話可以分為  RDB快照(預設快取)和AOF     RDB快照優勢是適合檔案備份  例如我們可以redis設定為晚上使用快取 資料   可能會丟失資料
save 60 1000,如果我在60秒內只更新了800條資料,然後系統崩潰了,那麼這800條資料就沒了
第二:
大資料量的時候,做RDB,redis服務會暫停近1分鐘(20g的實體記憶體,redis裡面有13g的資料)!
這個就是redis持久化的時候的服務暫停現象(為啥?建立子程序,子程序的工作不需要資源麼?)。
一種方式就是,我關閉自動快照的設定,就是不要寫save 10 1000這樣的命令,而是在系統不忙的時候傳送bgsave,
至少我能控制什麼時候系統發生停頓麼。再或者我傳送save,這個雖然會停頓,但是因為不用建立子程序有時候也比較快。

aof優勢在於:就算出問題了,最多丟失1秒內的更新資料
aof的劣勢:
aof檔案的體積可能會很大(可能比快照檔案還大),另一方面,系統重啟的時候回從aof裡讀命令
,如果aof檔案太大,讀命令也就要還很久

 

 

靜態頁面  freemarker   對於一些不經常改變的頁面  而且經常訪問的頁面 我可以做靜態化

freemarker簡單用法

assign可以在模板定義  然後直接使用  
<#assign linkman="你好">  聯絡人:${linkman}

<#include "head.ftl">引用別的模板


<#if success=true>  這裡等號是一個=也可以== 都可以
  這個success是後面穿過來的變數  是可變的
<#else>  
</#if>

<#list  goodslist as  goods>  迴圈遍歷goodslist
${goods_index }固定的取索引的方法
  ${goods.id}

</#list>
${goodslist?size} 取


<#assign text="{'bank':'工商銀行','電話':'123455666'}">
<#assign  text.bank>錯誤寫法  因為test是一個值
<#assign  data=text?eval>
${data.bank}

map.put("today",new Date());

 ${today?date}當前日期  2018-12-29 
 ${today?time}  當前時間 19:41:32  
   當前日期+時間  ${today?datetime}    2018-12-29   19:41:32
日期格式化  :${today?string('yyyy年MM月')}
  

Map.put ("point",143254243)
${point}  輸出143,254,243(怎麼去點點呢?)
${point?c} 輸出 為 143254243


判斷aaa是否存在
<#if aaa??>
aaa存在
${aaa}
<#else>
aaa不存在
</#if> 
這種方法麻煩
${bbb!''}  半段bbb是否存在
${bbb!'啊'}  半段bbb是否存在  不存在頁面顯示“啊”