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 的配置。
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/h-t8lOmnwDppiZioxN3t8w