<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

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

          共 1807字,需瀏覽 4分鐘

           ·

          2022-01-19 16:00

          程序員的成長之路
          互聯(lián)網(wǎng)/程序員/技術(shù)/資料共享?
          關(guān)注


          閱讀本文大概需要 2.8 分鐘。

          來自:https://blog.csdn.net/phil_code/article/details/79154271

          # OpenResty

          OpenResty是一個基于 Nginx與 Lua的高性能 Web平臺,其內(nèi)部集成了大量精良的 Lua庫、第三方模塊以及大多數(shù)的依賴項。用于方便地搭建能夠處理超高并發(fā)、擴展性極高的動態(tài)Web 應(yīng)用、Web 服務(wù)和動態(tài)網(wǎng)關(guān)。

          接入層緩存技術(shù)就是使用OpenResty的技術(shù)用Lua語言進行二次開發(fā)。


          # Nginx +redis?

          下圖左邊是常用的架構(gòu),http請求經(jīng)過nginx負載均衡轉(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:

          1、提高redis的讀取速度
          2、減少帶寬的占用

          壓縮會消耗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庫進行壓縮。

          # 定時更新

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

          緩存有效期可設(shè)置長些,比如1個小時,可保證1個小時內(nèi)tomcat掛掉,仍可使用緩存數(shù)據(jù)返回,緩存的定時更新時間可設(shè)置短些,比如1分鐘,保證緩存快速更新
          # 請求轉(zhuǎn)發(fā)

          瀏覽器打開頁面:

          1、nginx先從redis獲取頁面html
          2、redis不存在數(shù)據(jù)時,從tomcat獲取頁面,同時更新redis
          3、返回頁面HTML給瀏覽器
          #? 單進程定時更新

          Nginx的所有worker進程都可以處理前端請求轉(zhuǎn)發(fā)到redis,只有nginx worker 0才運行定時任務(wù)定時更新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的值相同則鑒權(quán)通過,允許修改nginx的配置。

          推薦閱讀:

          雷總,我可以的 !

          這個小學(xué)生,竟然把學(xué)校的網(wǎng)站搞了!

          互聯(lián)網(wǎng)初中高級大廠面試題(9個G)

          內(nèi)容包含Java基礎(chǔ)、JavaWeb、MySQL性能優(yōu)化、JVM、鎖、百萬并發(fā)、消息隊列、高性能緩存、反射、Spring全家桶原理、微服務(wù)、Zookeeper、數(shù)據(jù)結(jié)構(gòu)、限流熔斷降級......等技術(shù)棧!

          ?戳閱讀原文領(lǐng)取!? ? ? ? ? ? ? ??? ??? ? ? ? ? ? ? ? ? ?朕已閱?

          瀏覽 64
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  台湾无码精品 | 日韩人妻在线免费观看 | 久久久性爱| 亚洲色区在线 | 91黄色操逼视频 |