整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          億級流量紅包雨緩存實戰

          億級流量紅包雨緩存實戰
          • 標1:掌握清理Nginx緩存
          • 目標2:掌握Lua流程控制語法
          • 目標3:能實現Nginx+Lua多級緩存控制
          • 目標4:掌握紅包雨的緩存架構設計
          • 目標5:掌握隊列溢出控制設計方案
          • 目標6:掌握隊列削峰填谷的設計思想
          • 目標7:Nginx限流

          1 Nginx緩存清理

          很多時候我們如果不想等待緩存的過期,想要主動清除緩存,可以采用第三方的緩存清除模塊清除緩存nginx_ngx_cache_purge 。安裝nginx的時候,需要添加 purge 模塊, purge 模塊我們已經下載了,在 /usr/local/server 目錄下,添加該模塊 --add-module=/usr/local/server/ngx_cache_purge-2.3/ ,這一個步驟我們在安裝 OpenRestry 的時候已經實現了。

          安裝好了后,我們配置一個清理緩存的地址:

          這里 代表的是 (/.*) 的數據。

          每次請求 $host$key 就可以刪除指定緩存,我們可以先查看緩存文件的可以:

          此時訪問 <http://192.168.211.141/purge/user/wangwu>

          此時再查看緩存文件,已經刪除了。

          參數說明:

          2 Lua高性能腳本語言

          2.1 Lua介紹

          Lua是一門以其性能著稱的腳本語言,被廣泛應用在很多方面。Lua一般用于嵌入式應用,現在越來越多應用于游戲當中,魔獸世界,憤怒的小鳥都有用到。

          優勢:

          Lua腳本的作用:嵌入到應用程序中,給應用程序提供擴展功能。

          2.2 Lua安裝

          依賴安裝: yum install libtermcap-devel ncurses-devel libevent-devel readline-devel pcre-devel gccopenssl openssl-devel

          下載安裝包: curl -R -O http://www.lua.org/ftp/lua-5.3.5.tar.gz

          解壓安裝: tar zxf lua-5.3.5.tar.gz

          安裝:

          此時原來系統自帶的lua其實是5.1.4,我們需要替換原來系統自帶的lua:

          查看版本

          2.3 Lua常用知識

          2.3.1 Lua案例

          創建hello.lua文件,內容為

          編輯文件hello.lua

          在文件中輸入:

          保存并退出。

          執行命令

          輸出為:

          效果如下:

          lua有交互式編程(在控制臺編寫代碼)和腳本式編程(在文件中寫代碼叫腳本編程)。

          交互式編程就是直接輸入語法,就能執行。

          腳本式編程需要編寫腳本,然后再執行命令 執行腳本才可以。

          一般采用腳本式編程。(例如:編寫一個hello.lua的文件,輸入文件內容,并執行lua hell.lua即可)

          (1)交互式編程

          Lua 提供了交互式編程模式。我們可以在命令行中輸入程序并立即查看效果。

          Lua 交互式編程模式可以通過命令 lua -i 或 lua 來啟用:

          如下圖:

          (2)腳本式編程

          我們可以將 Lua 程序代碼保持到一個以 lua 結尾的文件,并執行,該模式稱為腳本式編程,例如上面入門程序中將lua語法寫到hello.lua文件中。

          2.3.2 Lua語法

          注釋

          一行注釋:兩個減號是單行注釋:

          多行注釋

          定義變量

          全局變量,默認的情況下,定義一個變量都是全局變量,

          如果要用局部變量 需要聲明為local.例如:

          如果變量沒有初始化:則 它的值為nil 這和java中的null不同。

          如下圖案例:

          Lua中的數據類型

          Lua 是動態類型語言,變量不要類型定義,只需要為變量賦值。 值可以存儲在變量中,作為參數傳遞或結果返回。

          Lua 中有 8 個基本類型分別為:nil、boolean、number、string、userdata、function、thread 和 table。

          lua紅有個type函數,能出對象的類型。

          實例:

          2.3.3 流程控制

          if語句

          Lua if 語句 由一個布爾表達式作為條件判斷,其后緊跟其他語句組成。

          語法:

          實例:

          if..else語句

          Lua if 語句可以與 else 語句搭配使用, 在 if 條件表達式為 false 時執行 else 語句代碼塊。

          語法:

          實例:

          循環[練習]

          while循環[滿足條件就循環]

          Lua 編程語言中 while 循環語句在判斷條件為 true 時會重復執行循環體語句。 語法:

          實例:

          效果如下:

          for循環[練習]

          Lua 編程語言中 for 循環語句可以重復執行指定語句,重復次數可在 for 語句中控制。

          語法: 1->10 1:exp1 10:exp2 2:exp3:遞增的數量

          var 從 exp1 變化到 exp2,每次變化以 exp3 為步長遞增 var,并執行一次 "執行體"。exp3 是可選的,如果不指定,默認為1。

          例子:

          for i=1,9,2 :i=1從1開始循環,9循環數據到9結束,2每次遞增2

          repeat...until語句[滿足條件結束][練習]

          Lua 編程語言中 repeat...until 循環語句不同于 for 和 while循環,for 和 while 循環的條件語句在當前循環執行開始時判斷,而 repeat...until 循環的條件語句在當前循環結束后判斷。

          語法:

          案例:

          函數

          lua中也可以定義函數,類似于java中的方法。例如:

          執行之后的結果:

          ..:表示拼接

          table 是 Lua 的一種數據結構用來幫助我們創建不同的數據類型,如:數組、字典等。

          Lua也是通過table來解決模塊(module)、包(package)和對象(Object)的。

          案例:

          模塊

          (1)模塊定義

          模塊類似于一個封裝庫,從 Lua 5.1 開始,Lua 加入了標準的模塊管理機制,可以把一些公用的代碼放在一個文件里,以 API 接口的形式在其他地方調用,有利于代碼的重用和降低代碼耦合度。

          創建一個文件叫module.lua,在module.lua中創建一個獨立的模塊,代碼如下:

          由上可知,模塊的結構就是一個 table 的結構,因此可以像操作調用 table 里的元素那樣來操作調用模塊里的常量或函數。

          上面的 func2 聲明為程序塊的局部變量,即表示一個私有函數,因此是不能從外部訪問模塊里的這個私有函數,必須通過模塊里的公有函數來調用.

          (2)require 函數

          require 用于 引入其他的模塊,類似于java中的類要引用別的類的效果。

          用法:

          兩種都可以。

          我們可以將上面定義的module模塊引入使用,創建一個test_module.lua文件,代碼如下:

          2 多級緩存架構

          任何項目中我們都有一些頻繁的查詢,而那些頻繁的查詢數據基本都是相同的,比如項目中查看用戶個人信息,購物狂歡查詢活動信息,這些功能點使用頻率非常高,我們一般需要對他們做特殊處理。

          我們以狂歡活動信息為例,當雙十一的時候,很多人會去查看今天優惠活動有哪些,對這些活動信息我們可以采用多級緩存架構來抗住高并發。

          2.1 多級緩存架構對比

          基于Java版的緩存架構實現流程如下:

          優點:

          缺點:

          優點:

          2.2 Nginx+Lua多級緩存實戰

          我們以雙十一活動信息加載為例,通過多級緩存架構來加載雙十一活動信息,雙十一活動信息表結構如下:

          2.2.1 鏈接MySQL封裝

          創建一個lua腳本 mysql.lua ,用于提供根據SQL語句執行查詢操作,代碼如下:

          2.2.2 鏈接Redis集群封裝

          我們需要安裝 lua-resty-redis-cluster ,用該依賴庫實現Redis集群的操作,這里提供github地址,大家下載后按操作配置即可,下載地址: <https://github.com/cuiweixie/lua-resty-redis-cluster> ,下載該文件配置后即可實現Redis集群操作。

          接下來我們實現Redis集群操作,創建一個腳本 redis.lua ,腳本中實現Redis中數據的查詢和添加操作,代碼如下:

          2.2.3 多級緩存操作

          配置創建Nginx緩存共享空間

          創建多級緩存操作腳本 activity.lua ,代碼如下:

          Nginx配置:

          3 紅包雨案例剖析

          每次在雙十一或者618的時候,各大電商平臺為了吸引用戶,都會給與用戶很大的優惠,比如送優惠券、搶紅包等,搶優惠券或者紅包的用戶群體非常大,這時候會給服務器帶來的并發也是非常大,解決這塊問題,架構是關鍵。

          3.1 搶紅包案例分析

          雙十一搶紅包或者過年微信、QQ紅包雨活動的并發量非常龐大,紅包雨存在的規則也是非常多的,我們先來分析一下紅包雨的特點。

          3.2 紅包雨多級緩存架構設計

          上面我們已經分析過紅包雨的特點,要想實現一套高效的紅包雨系統,緩存架構是關鍵。我們根據紅包雨的特點設計了如上圖所示的紅包雨緩存架構體系。

          4 緩存隊列-并發溢出高效控制設計

          并發量非常大的系統,例如秒殺、搶紅包、搶票等操作,都是存在溢出現象,比如秒殺超賣、搶紅包超額、一票多單等溢出現象,如果采用數據庫鎖來控制溢出問題,效率非常低,在高并發場景下,很有可能直接導致數據庫崩潰,因此針對高并發場景下數據溢出解決方案我們可以采用Redis緩存提升效率。

          4.1 設計分析

          用戶搶紅包的時候,我們會分批次發放紅包,每次發放紅包會先根據發放紅包的金額和紅包的個數把每個紅包計算好,然后存入到Redis隊列中,存入到Redis隊列后,用戶每次搶紅包都直接從Redis隊列中獲取一個紅包即可,由于Redis是單線程,在這里可以有效的避免多個人同時搶到了一個紅包,類似一種超賣現象。

          表結構設計:

          4.2 紅包定時導入緩存隊列

          初始化讀取

          創建容器監聽類 com.itheima.quartz.MoneyPushTask ,讓該類實現接口 ApplicationListener ,當容器初始化完成后,會調用 onApplicationEvent 方法, 我們可以在該方法中實現初始化讀取數據,將數據填充到變量中。

          MoneyPushTask 代碼如下:

          定時加載

          定時加載我們需要開

          搶紅包緩存隊列溢出控制

          上面已經實現將紅包存入到Redis緩存隊列中,用戶每次搶紅包的時候,只需要從Redis緩存隊列中獲取即可。com.itheima.controller.RedPacketController 代碼:

          com/itheima/service/RedPacketService.java 代碼:

          com.itheima.service.impl.RedPacketServiceImpl 代碼:

          5 隊列術限流

          5.1 高并發場景分析

          用戶搶紅包的高并發場景下,如果讓后端服務器直接處理所有搶紅包操作,服務器很有可能會崩潰,就像高鐵站如果很多人蜂擁擠進站而不排隊,很有可能導致整個高鐵站秩序混亂,高鐵站服務崩潰,程序也是如此。

          解決大量并發用戶蜂擁而上的方法可以采用隊列術將用戶的請求用隊列緩存起來,后端服務從隊列緩存中有序消費,可以防止后端服務同時面臨處理大量請求。緩存用戶請求可以用RabbitMQ、Kafka、RocketMQ、ActiveMQ,我們這里采用RabbitMQ即可。

          5.2 隊列削峰實戰

          用戶搶紅包的時候,我們用Lua腳本實現將用戶搶紅包的信息以生產者角色將消息發給RabbitMQ,后端應用服務以消費者身份從RabbitMQ獲取消息并搶紅包,再將搶紅包信息以WebSocket方式通知給用戶。

          如果想使用Lua識別用戶令牌,我們需要引入 lua-resty-jwt 模塊,是用于 ngx_lua 和 LuaJIT 的 Lua 實現庫,在該模塊能實現Jwt令牌生成、Jwt令牌校驗,依賴庫的地址: https://github.com/SkyLothar/lua-resty-jwt

          lua-resty-jwt安裝

          在 資料\lua 中已經下載好了該依賴庫 lua-resty-jwt-master.zip ,我們將該庫文件上傳到服務器上,并解壓,當然,我們也可以使用opm直接安裝 lua-resty-jwt ,配置 lua-resty-jwt 之前,我們需要先安裝resty和opm。

          安裝倉庫管理工具包:

          添加倉庫地址:

          安裝resty:

          安裝opm:

          安裝Jwt組件:

          此時 lua-resty-jwt 安裝好了,可以直接使用了。

          令牌校驗庫token.lua

          搶紅包隊列腳本:mq.lua,參考地址 <https://github.com/wingify/lua-resty-rabbitmqstomp>

          搶紅包隊列腳本:mq.lua,參考地址 <https://github.com/wingify/lua-resty-rabbitmqstomp>

          Java監聽

          5.3 搶紅包測試

          打開資料中的 html/websocket.html ,執行搶紅包測試,效果如下:

          6 Nginx限流(作業)

          一般情況下,雙十一很多查詢的并發量是比較大的,即使 有了多級緩存,當用戶不停的刷新頁面的時候,也是沒有必要的,另外如果有惡意的請求 大量達到,也會對系統造成影響。而限流就是保護措施之一。

          6.1 限流理解

          限流和生活中很多現實場景類似,如下場景:

          • 水壩泄洪,通過閘口限制洪水流量(控制流量速度)。
          • 辦理銀行業務:所有人先領號,各窗口叫號處理。每個窗口處理速度根據客戶具體業務而定,所有人排隊等待叫號即可。若快下班時,告知客戶明日再來(拒絕流量)
          • 火車站排隊買票安檢,通過排隊 的方式依次放入。(緩存帶處理任務)

          而程序限流,主要是控制應對高并發和惡意操作的一種技術手段。

          6.2 Nginx限流實戰

          nginx提供兩種限流的方式:

          • 一是控制速率
          • 二是控制并發連接數

          6.2.1 速率限流

          控制速率的方式之一就是采用漏桶算法。

          (1)漏桶算法實現控制速率限流

          漏桶(Leaky Bucket)算法思路很簡單,水(請求)先進入到漏桶里,漏桶以一定的速度出水(接口有響應速率),當水流入速度過大會直接溢出(訪問頻率超過接口響應速率),然后就拒絕請求,可以看出漏桶算法能強行限制數據的傳輸速率.示意圖如下:

          (2)nginx的配置

          配置示如下:

          創建限流緩存空間:

          配置限流:

          參數說明:

          如果惡意一直刷新會出現如下現象:

          (3)處理突發流量

          上面例子限制 2r/s,如果有時正常流量突然增大,超出的請求將被拒絕,無法處理突發流量,可以結合 burst 參數使用來解決該問題。

          例如,如下配置表示:

          burst 譯為突發、爆發,表示在超過設定的處理速率后能額外處理的請求數,當 rate=10r/s 時,將1s拆成10份,即每100ms可處理1個請求。

          此處,burst=4 ,若同時有4個請求到達,Nginx 會處理第一個請求,剩余3個請求將放入隊列,然后每隔500ms從隊列中獲取一個請求進行處理。若請求數大于4,將拒絕處理多余的請求,直接返回503.

          不過,單獨使用 burst 參數并不實用。假設 burst=50 ,rate依然為10r/s,排隊中的50個請求雖然每100ms會處理一個,但第50個請求卻需要等待 50 * 100ms即 5s,這么長的處理時間自然難以接受。

          因此,burst 往往結合 nodelay 一起使用。

          例如:如下配置:

          如上表示:

          平均每秒允許不超過2個請求,突發不超過4個請求,并且處理突發4個請求的時候,沒有延遲,等到完成之后,按照正常的速率處理。

          完整配置如下:

          6.2.2 控制并發量(連接數)

          ngx_http_limit_conn_module 提供了限制連接數的能力。主要是利用limit_conn_zone和limit_conn兩個指令。利用連接數限制 某一個用戶的ip連接的數量來控制流量。

          注意:并非所有連接都被計算在內 只有當服務器正在處理請求并且已經讀取了整個請求頭時,才會計算有效連接。此處忽略測試。

          配置語法:

          (1)配置限制固定連接數

          如下,配置如下:

          配置限流緩存空間:

          location配置:

          參數說明:

          (2)限制每個客戶端IP與服務器的連接數,同時限制與虛擬服務器的連接總數。

          限流緩存空間配置:

          location配置

          每個IP限流 3個

          總量5個

          外!CFM-Hello語音杯團隊賽開戰,就在今天!16個民間大手子隊要開始神仙打架了!比賽看個熱鬧就完事兒了,冠軍那幾萬大獎跟咱沒關系;直播間搞得抽獎活動,我等屁民還是可以去爭一爭滴,聽說發的是現金喔!


          Hello語音這次組織的比賽真是聲勢浩大,一個星期前250支隊伍打海選,打到現在剩16支隊伍爭冠;這16支隊伍的平民玩家不光過足了電競的癮,享受到比賽的刺激,還能馬上在斗魚直播里當一回明星選手,簡直不要太爽!


          Hello語音為這次團隊賽請來了CFM官方解說西瓜丶SV,另外馬上開打的個人賽請到官方解說朗大朝;都是官方解說界的大紅人了,有這倆專業解說,觀賽體驗都上了一個檔次了,這民間賽的辦賽規格怕是跟官方專業比賽有一拼噢!


          (團隊賽解說西瓜丶SV直播地址:https://www.douyu.com/5961790)


          (個人賽解說朗大朝直播地址:https://www.douyu.com/6368510)

          比賽相關的事簡單說下吧,4月8號16強賽正式開打,打到18號決冠軍,基本是晚上7點開打,具體的比賽信息hello語音里都有,要了解的朋友自己去看;這次冠軍獎金達到15000,總獎金也有40000,前8都有錢,搞得我都想組隊參加下一屆比賽了!


          (團隊賽獎勵)


          (官方地址:https://hstatic.ppx520.com/front/online/project/HYC-CFM/index.html)

          另外,直播間有抽獎的事兒已經是板上釘釘了,聽說下現金紅包雨和貴重的游戲道具;我估摸著不光是OB間隙的常規抽獎,比如高光擊殺、選手采訪啥的也會來個突擊抽獎;所以各位觀眾老爺別怪我沒提醒,好好守著比賽時間吧,搞不好準點開播先來一手抽獎!


          路人朋友的觀賽指南就這些了,下面聊聊圈內人的事兒,有興趣的朋友可以繼續閱讀。Hello語音這個比賽從海選到現在也打了一個星期了,講道理精彩程度還真不輸職業比賽;現金獎勵多的好處就是選手都特認真,而打出的高光操作都來自我們身邊的普通人,這種觀賽代入感遠比看職業比賽要強的多;說不定下一屆我們也能成為賽事的其中一員,去追逐屬于自己的電競夢!

          JavaScript結合HTML5寫了這個手機移動端搶紅包特效,2018的年新年紅包你能搶到多少呢?

          如果大家下載源碼沒搶到紅包,小編就把這個項目如何完成的當中禮物送個大家啦

          當在電腦上打開頁面時是點擊不了紅包的,所以我在pc端審查元素來截圖給大家看的,

          想要這個H5手機端搶紅包項目的可以來HTML5進階群:640633433,已經上傳文件,可以直接下載。

          下面就是搶紅包這個項目的源碼圖:

          今天的這邊文章就分享到這了,需要這個h5項目練練手的可以來前端學習群640633433,可以自動領取項目源碼學習。

          寫了這個特效,主管能給我這次漲薪資的機會,其實這項目大家知道不是很難,公司是外包公司,總共也就十幾個人,有點辛苦,對于我剛入職的來說,辛苦點不算什么,只要自己能學到技術,能增長我的經驗。

          謝謝大家點評與提問!


          主站蜘蛛池模板: 综合久久久久久中文字幕亚洲国产国产综合一区首| 国模无码一区二区三区 | 精品一区二区三区影院在线午夜 | 欧美激情一区二区三区成人| 日本在线视频一区二区| 无码一区二区波多野结衣播放搜索| 亚洲a∨无码一区二区| 国产av一区二区精品久久凹凸| 一区二区精品视频| 无码日韩精品一区二区免费暖暖| 中文字幕一区二区精品区| 国模精品视频一区二区三区| 国产美女视频一区| 精品无码国产一区二区三区AV | 杨幂AV污网站在线一区二区| 国产一区二区三区在线2021| 91精品一区二区三区久久久久| 日韩高清一区二区三区不卡 | AA区一区二区三无码精片| 色综合一区二区三区| 久久久国产精品一区二区18禁 | 一区二区三区四区在线播放| 日本在线不卡一区| 日本高清天码一区在线播放| 亚洲色精品aⅴ一区区三区| 亚洲色偷精品一区二区三区| 老湿机一区午夜精品免费福利| 无码毛片视频一区二区本码| 福利国产微拍广场一区视频在线 | 国产成人精品无码一区二区| 无码人妻精品一区二区三区9厂| 国产亚洲一区区二区在线 | 一区国严二区亚洲三区| 久久久久人妻一区二区三区| 国产精品小黄鸭一区二区三区 | 波多野结衣中文字幕一区| 亚洲国产精品第一区二区| 亚洲一区视频在线播放| 国产一区二区好的精华液| 亚洲AV福利天堂一区二区三 | 日韩人妻精品一区二区三区视频 |