丨秒殺大多數(shù)開發(fā)問題的兩個(gè)利器和測(cè)試案例_第1頁
丨秒殺大多數(shù)開發(fā)問題的兩個(gè)利器和測(cè)試案例_第2頁
丨秒殺大多數(shù)開發(fā)問題的兩個(gè)利器和測(cè)試案例_第3頁
丨秒殺大多數(shù)開發(fā)問題的兩個(gè)利器和測(cè)試案例_第4頁
丨秒殺大多數(shù)開發(fā)問題的兩個(gè)利器和測(cè)試案例_第5頁
已閱讀5頁,還剩22頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

從我個(gè)人的經(jīng)驗(yàn)來看,學(xué)習(xí)OpenResty的API是相對(duì)容易 API不是最常用、最重要的部分嗎,為什么花的筆墨不多?其實(shí),這主要是出于兩個(gè)方面的考第一,OpenResty提供了非常詳盡的文檔。和很多其他的開發(fā)語言或者平臺(tái)相比,OpenResty除了提供API的參楚地告訴你API是如何處理各種邊界條件的。這種在API定義下面緊跟著示例代碼和注意事項(xiàng)的做法,就是OpenResty文檔的一貫風(fēng)格。這樣一來,在看完API描第二,在文檔之外,OpenResty還提供了高覆蓋度的測(cè)試案例集。剛剛我提到過,OpenResty文檔中提供了API的代碼示例,但終究篇幅有限,多個(gè)API之間如何配合使用、對(duì)于OpenResty開發(fā)者來說,最A(yù)PI習(xí)資料就是經(jīng)驗(yàn)。讓我們用一個(gè)真實(shí)的例子來體驗(yàn)下,在OpenRestyshdictgetshareddict(共享字典)是基于NGINX共享內(nèi)存區(qū)的Lua字典對(duì)象,它可以跨多個(gè)worker來存取數(shù)據(jù),一般用來存放限流、限速、緩存等數(shù)據(jù)。shareddict相關(guān)的API有20多個(gè),是OpenResty中最常用也是最重要的組API。我們以最簡(jiǎn)單的get以開文檔對(duì)照。下面的最小化的代碼示例,正是由文檔改編而代httplua_shared_dictdogsserverlocation/democontent_by_lua_blocklocal dogs:set("Jim",local 簡(jiǎn)單說明一下,在Lua碼中使用shareddict前,我們需要在nginx.conflua_shared_dict指令增加一塊內(nèi)存空間,它的名字是dogs,大小為10M。修改完nginx.conf后,你還需要重啟進(jìn)程,用瀏覽器或者curl訪式改造一下。你可以看到,使用restyCLI的這種方式,和在nginx.conf中嵌入代碼的效果是一致的。代$resty--shdict'dogs10m'-e'localdogs=dogs:set("Jim",localv='你現(xiàn)在已經(jīng)知道nginx.conf和Lua代碼是如何配合的,也成功運(yùn)行了shareddict的set和get方法。般來說,大事實(shí)上,這里還是有幾個(gè)值得注意的地方,比如哪些階段不能使用共享內(nèi)存相關(guān)的API呢?我們?cè)谑纠a中看到get函數(shù)只有 get函數(shù)的入?yún)⑹鞘裁搭愋停渴欠裼虚L(zhǎng)度限更好的深入OpenResty。接下來我就帶你一一解讀。哪些階段不能使用共享內(nèi)存相關(guān)的API先來看第個(gè)問題,答案很直接,文檔中專門有個(gè)context(即上下文部分),里面列出了在什么環(huán)境下可以使用這個(gè)API:代context:set_by_lua*,rewrite_by_lua*,可以看init和init_worker兩個(gè)階段不在其中,也就是說,共享內(nèi)存的getAPI不能在這兩個(gè)階段使用。需要注意的是,每個(gè)共享內(nèi)存的API可以使用的階段并不完全相同,比如setAPI就可以在init階段使用。當(dāng)然了,盡信書不如無書,OpenResty的文檔有時(shí)候也會(huì)接下來,讓我們修改下測(cè)試案例集,來確定下init階段是否可以運(yùn)行shareddict的getAPI。那該如何找到和共享內(nèi)存相關(guān)的測(cè)試案例集呢?事實(shí)上,OpenRy的測(cè)試案例都放在/t 下,并且命名也是有規(guī)律的,即自增數(shù)字-功名.t。搜索hit到043-dc.t,而這就是共享內(nèi)存的測(cè)試案例集了,它里面有接近0個(gè)測(cè)試案例,包含各種正常和異情況的測(cè)試。我們來試著修改下第一個(gè)測(cè)試案你可以把content階段改為init階段,并精簡(jiǎn)掉無關(guān)碼,看看get接口能否運(yùn)行。這里我需要提醒一點(diǎn),在現(xiàn)的,你只要知道它是在測(cè)試get接口就可以了:代1===TEST1:stringkey,int---lua_shared_dictdogs---location=/testinit_by_lualocaldogs=localval= ---GET---------你應(yīng)該注意到了,在測(cè)試案例的最后,我加了--ONLY標(biāo)種各樣的標(biāo)記,你先記住這里就可以修改完以后,我prove令,就可以運(yùn)行這個(gè)測(cè)試案代1$provet/043-代1nginx:[emerg]"init_by_lua"directiveisnotallowedget 檔最開始就是這個(gè)接口的syntax語法描述部分:代value,flags=正常情況下第一個(gè)參數(shù)value返回的是字典中key對(duì)應(yīng)的值;但key在或者過期時(shí),value的值為nil第二個(gè)flags就稍微復(fù)雜一些了,如果set口設(shè)置了flags,就返回,否則不返回。API用出錯(cuò),value返回nil,flags返回具體的錯(cuò)從文檔總結(jié)的信息我們可以看出,localv=dogs:get("Jim")這種只有一個(gè)接收參數(shù)的寫法并不完善,因?yàn)樗桓采w了普通的使用場(chǎng)景,沒有接收第個(gè)參數(shù),也沒有做代localdata,err=ifdata==nilanderrngx.say("getnotok:",代1===TEST65:getnil2--3lua_shared_dictdogs4--5location=/test6content_by_lua7localdogs=8localok,err=9ifnotokngx.say("notok:", }----ok:nil-- 在這個(gè)測(cè)試案例中,get的入?yún)閚il,返回的err是nilkey。這一方面驗(yàn)證了我們對(duì)文檔的分析是正的,另一方面,也為第三個(gè)問題提供了部分答案——起碼get入?yún)⒉荒苁莕ilget至于第三個(gè)問題,get的入?yún)⒖梢允鞘裁搭愋偷哪??我們按有注明key的合法類型有哪些。這時(shí)該怎么辦呢?別著急,至少我們知道key以是字符串類型,并且不能為nil。不知道你還記得Lua中的數(shù)據(jù)類型嗎?除了字符串和作為key必要性,我們只需要驗(yàn)證前兩個(gè)。不妨先去測(cè)試文件中搜索一下,是否有數(shù)字作為key的案例:代1===TEST4:numberkeys,string通過這個(gè)測(cè)試案例,你可以清楚看到,數(shù)字也可以作為代1$resty--shdict'dogs10m'-e'localdogs= 不出意料,果然報(bào)錯(cuò)了代1ERROR:(commandline-e):2:badargument#1to'get'綜上,我們可以得出結(jié)論:getAPI受的key型為字符那么入?yún)ey長(zhǎng)度是否有限制呢?這里其實(shí)也有一個(gè)對(duì)應(yīng)代1===TEST67:getatoo-long2--3lua_shared_dictdogs4--5location=/test6content_by_lua localdogs= localok,err=dogs:get(string.rep("a", ifnotok

ngx.say("notok:",err)

}----ok:keytoo-- 很顯然,字符串長(zhǎng)度為65536時(shí)候,就會(huì)被key長(zhǎng)了。你可以試下把長(zhǎng)度改為65535,雖然只少了1個(gè)字節(jié),卻不會(huì)再報(bào)錯(cuò)了。這就說明,key的最大長(zhǎng)度正是OpenResty現(xiàn)在的文檔只有英文版本,國內(nèi)工程師在的嘗試,去確定出答案。這才是輔助我們學(xué)習(xí)的正確途最后,提醒一下,在OpenResty的API中,凡是返回連接池,或者在API調(diào)用失敗的情況下繼續(xù)后面的邏輯,總那么,你在寫OpenResty代碼的時(shí)候,如果遇到問題,一般是通過什么方式來解決的?是文檔、郵件列表、QQ群, 售賣。頁面已增加防盜追蹤,上一 15|OpenResty和別的開發(fā)平臺(tái)有什么不同下一 17|為什么能成為更好的Web服務(wù)器?動(dòng)態(tài)處理請(qǐng)求言精選留言言1sudoyuminstallcpan-ysudocpanYAMLsudocpan展2展1??展resty--shdict'dogs10m'-e'localdogs=locallock=展1 共享內(nèi)存相關(guān)的API?"這個(gè)例子舉的貌似不太對(duì)。展 2019/07/0211:16:12[error]11184#3284:*3entrythreadaborted:runtime展1 老師,你好看了opeestonteestgtes-文檔。今天看到的部分有一個(gè)疑問,在RunnigTestestetestblo默認(rèn)是shufe展己的項(xiàng)目中都是用no_shuffle,嚴(yán)格按照順序來執(zhí)行。TEST_NGINX__RESTART_

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論