高併發場景下使用緩存能夠有效下降併發QPS對於數據庫的壓力,可是使用緩存就必須面對數據一致性的問題。java
有效利用java多線程特性並行計算,充分利用CPU資源。 在序列化處理上考慮更好的工具,好比以前數據是用XML,JSON存儲,隨着訪問量的飆升,CPU和帶寬帶來了很大的壓力,後來咱們本身定義了一種傳輸協議和序列化方案,一方面數據壓縮到原來的30%~40%,極大節約了寬帶,同時CPU的運算量大大下降,服務器數量也隨之減小。數據庫
好比咱們以前用Fastjson,正常狀況下確實解析很快,可是一旦併發量上來後,就會愈來愈吃內存,甚至JVM很快內存溢出。 緣由是Fastjson設計的初衷是先把整個數據裝載至內存,而後解析,因此執行很快,但會至關消耗內存。json
因此Fastjson是有他適合的使用場景的,做爲架構師須要對本身的場景有很好的理解,在技術選型上有很好的取捨。緩存
同時引入NIO解決過多長鏈接致使的系統穩定性和開銷問題。服務器
爲完成數據異步更新到緩存,能夠採用消息隊列方式(主備AMQ)來管理異步任務。 異步更新緩存的核心邏輯是,如何判斷緩存過時。上圖中引入了一個Router。 舉個例子:運營會設置細化一個航班段的緩存有效期,好比北京到紐約,通常來講買機票的人很少,航班信息緩存幾天沒有問題,但若是是北京到上海,可能只能最多5分鐘了。多線程
Router解決的複雜工做,咱們叫「去僞存真」。進行一些規則設計,這個規則設計須要很靈活,也能夠引入消息隊列進行異步化解耦,進行很好的讀寫分離。架構
總體系統流轉併發
當緩存系統相關數據過時後,前臺搜索告知MQ有實時搜索任務,MQ統一把異步任務交給Router,這是Router不會直接請求下游數據,而是找Node池。異步
Node池會動態分配一個Node節點給Router,最後Router查找Node節點映射的數據,最後異步更新到緩存數據。高併發