Nginx+Redis:高性能緩存利器
一. OpenResty
OpenResty是一個基于 Nginx與 Lua的高性能 Web平臺,其內(nèi)部集成了大量精良的 Lua庫、第三方模塊以及大多數(shù)的依賴項。用于方便地搭建能夠處理超高并發(fā)、擴(kuò)展性極高的動態(tài)Web 應(yīng)用、Web 服務(wù)和動態(tài)網(wǎng)關(guān)。
接入層緩存技術(shù)就是使用OpenResty的技術(shù)用Lua語言進(jìn)行二次開發(fā)。

二.Nginx +redis
下圖左邊是常用的架構(gòu),http請求經(jīng)過nginx負(fù)載均衡轉(zhuǎn)發(fā)到tomcat,tomcat再從redis讀取數(shù)據(jù),整個鏈路過程是串行的,當(dāng)tomcat掛掉或者tomcat線程數(shù)被消耗完,就無法正常返回數(shù)據(jù)。
使用OpenResty的lua-resty-redis模塊使nginx具備直接訪問redis的能力,不占用tomcat線程,Tomcat暫時掛掉仍可正常處理請求,減少響應(yīng)時長,提高系統(tǒng)并發(fā)能力。

三.壓縮減少帶寬
數(shù)據(jù)大于1K,nginx壓縮再保存到redis:
提高redis的讀取速度
減少帶寬的占用
壓縮會消耗cpu時間,小于1K的數(shù)據(jù)不壓縮tps更高。
OpenResty并沒有提供redis連接池的實現(xiàn),需要自己用lua實現(xiàn)redis的連接池,在網(wǎng)上已有實現(xiàn)的例子http://wiki.jikexueyuan.com/project/openresty/redis/out_package.html,直接參照使用。
Redis的value值用json格式保存{length:xxx,content:yyy},content是壓縮后的頁面內(nèi)容,length是content壓縮前的大小,length字段是為了在讀取redis時,根據(jù)length的大小來判斷是否要解壓縮content的數(shù)據(jù)。
使用lua-zlib庫進(jìn)行壓縮。

四. 定時更新
按下圖第1和第2步定時執(zhí)行,nginx lua定時器定時請求tomcat頁面的url,返回的頁面html保存在redis。另外,搜索公眾號Linux就該這樣學(xué)后臺回復(fù)“git書籍”,獲取一份驚喜禮包。
緩存有效期可設(shè)置長些,比如1個小時,可保證1個小時內(nèi)tomcat掛掉,仍可使用緩存數(shù)據(jù)返回,緩存的定時更新時間可設(shè)置短些,比如1分鐘,保證緩存快速更新

五.請求轉(zhuǎn)發(fā)
瀏覽器打開頁面:
nginx先從redis獲取頁面html
redis不存在數(shù)據(jù)時,從tomcat獲取頁面,同時更新redis
返回頁面HTML給瀏覽器

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

七 . 可配置化
通過管理后臺配置需要緩存的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的值相同則鑒權(quán)通過,允許修改nginx的配置。

- END - ?推薦閱讀? 31天拿下K8s含金量最高的CKA+CKS證書! 主流監(jiān)控系統(tǒng) Prometheus 學(xué)習(xí)指南 基于 eBPF 的 Kubernetes 問題排查全景圖發(fā)布 一文掌握 Ansible 自動化運維 Linux的10個最危險命令 Kubernetes網(wǎng)絡(luò)難懂?可能是沒看到這篇文章 24 個 Docker 常見問題處理技巧 23 款 DevOps 工具建設(shè)云原生時代 Shell分析日志文件,全面解鎖新姿勢! 這篇文章帶你全面掌握 Nginx ! 基于Nginx實現(xiàn)灰度發(fā)布與AB測試 一文搞懂 Kubernetes 網(wǎng)絡(luò)通信原理 SRE本質(zhì)就是一個懂運維的資深開發(fā) 搭建一套完整的企業(yè)級 K8s 集群(kubeadm方式) 點亮,服務(wù)器三年不宕機(jī)


