Nginx+Redis 搭建高性能緩存利器


一. OpenResty

OpenResty是一個基於 Nginx與 Lua的高性能 Web平台,其內部集成了大量精良的 Lua庫、第三方模塊以及大多數的依賴項。

用於方便地搭建能夠處理超高並發、擴展性極高的動態Web 應用、Web 服務和動態網關。

接入層緩存技術就是使用OpenResty的技術用Lua語言進行二次開發。

image

二.Nginx +redis

下圖左邊是常用的架構,http請求經過nginx負載均衡轉發到tomcat,tomcat再從redis讀取數據,整個鏈路過程是串行的,

當tomcat掛掉或者tomcat線程數被消耗完,就無法正常返回數據。使用OpenResty的lua-resty-redis模塊使nginx具備直接訪問redis的能力,

不占用tomcat線程,Tomcat暫時掛掉仍可正常處理請求,減少響應時長,提高系統並發能力。

image

三.壓縮減少帶寬

數據大於1K,nginx壓縮再保存到redis:

  • 提高redis的讀取速度
  • 減少帶寬的占用

壓縮會消耗cpu時間,小於1K的數據不壓縮tps更高。

OpenResty並沒有提供redis連接池的實現,需要自己用lua實現redis的連接池,

在網上已有實現的例子http://wiki.jikexueyuan.com/project/openresty/redis/out_package.html,直接參照使用。

Redis的value值用json格式保存{length:xxx,content:yyy},content是壓縮后的頁面內容,length是content壓縮前的大小,

length字段是為了在讀取redis時,根據length的大小來判斷是否要解壓縮content的數據。

使用lua-zlib庫進行壓縮。

image

四. 定時更新

按下圖第1和第2步定時執行,nginx lua定時器定時請求tomcat頁面的url,返回的頁面html保存在redis。

緩存有效期可設置長些,比如1個小時,可保證1個小時內tomcat掛掉,仍可使用緩存數據返回,

緩存的定時更新時間可設置短些,比如1分鍾,保證緩存快速更新

image

五.請求轉發

瀏覽器打開頁面:

  • nginx先從redis獲取頁面html
  • redis不存在數據時,從tomcat獲取頁面,同時更新redis
  • 返回頁面HTML給瀏覽器

image

六. 單進程定時更新

Nginx的所有worker進程都可以處理前端請求轉發到redis,

只有nginx worker 0才運行定時任務定時更新redis,lua腳本中通過ngx.worker.id()獲取worker進程編號。

image

七 . 可配置化

通過管理后台配置需要緩存的URL,可配置緩存URL、緩存有效期、定時更新時間,

比如modify?url=index&&expire=3600000&&intervaltime=300000&sign=xxxx,sign的值是管理后台secretkey

modify?url=index&&expire=3600000&&intervaltime=300000簽名運算得到的,

nginx端用相同的secretkey對modify?url=index&&expire=3600000&&intervaltime=300000簽名運算,

得到的值與sign的值相同則鑒權通過,允許修改nginx的配置。

image


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM