Nginx+Redis:高性能緩存利器

一. OpenResty
OpenResty是一個基於 Nginx與 Lua的高性能 Web平臺,其內部集成了大量精良的 Lua庫、第三方模塊以及大多數的依賴項。用於方便地搭建能夠處理超高併發、擴展性極高的動態Web 應用、Web 服務和動態網關。

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

二.Nginx +redis
下圖左邊是常用的架構,http請求經過nginx負載均衡轉發到tomcat,tomcat再從redis讀取數據,整個鏈路過程是串行的,當tomcat掛掉或者tomcat線程數被消耗完,就無法正常返回數據。

使用OpenResty的lua-resty-redis模塊使nginx具備直接訪問redis的能力,不佔用tomcat線程,Tomcat暫時掛掉仍可正常處理請求,減少響應時長,提高系統併發能力。

三.壓縮減少帶寬
數據大於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庫進行壓縮。

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

緩存有效期可設置長些,比如1個小時,可保證1個小時內tomcat掛掉,仍可使用緩存數據返回,緩存的定時更新時間可設置短些,比如1分鐘,保證緩存快速更新

五.請求轉發
瀏覽器打開頁面:

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

六. 單進程定時更新
Nginx的所有worker進程都可以處理前端請求轉發到redis,只有nginx worker 0才運行定時任務定時更新redis,lua腳本中通過ngx.worker.id()獲取worker進程編號。

七 . 可配置化
通過管理後臺配置需要緩存的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的配置。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章