ngx lua獲取時間戳的幾種方式



原創自由de單車 最后發布於2017-02-14 14:58:43 閱讀數 18218 收藏

在ngx_lua里,獲取時間相關信息的方式大概有4種(見下面代碼):

print(string.format("%s, %s, %s, %s", ngx.time(), os.time(), os.clock(), ngx.now()))
ngx.exit(200)

-- 以上代碼會輸出:1486971340, 1486971340, 209.77, 1486971340.422

可見,通過os.clock()獲取到的並不是時間戳,它獲取的是一個程序使用CPU時間的一個近似值,而我們的目的是獲取時間戳,所以排除掉這種方法。

再看ngx.time()和os.time(),它們返回的都是秒級精度的時間戳,而ngx.now()返回的是毫秒級精度的時間戳。做開發時可以根據實際的精度需要來選擇不同的獲取方式。

那么,ngx.time()和os.time()有什么區別嗎?
有,os.time()會涉及系統調用,而ngx.time()不會,所以ngx.time()的性能會比os.time()高。

但在使用ngx.time()和ngx.now()的時候,有一點是要注意的,就是通過這兩種方式獲取到的只是nginx緩存起來的時間戳,不是實時的。所以有時候會出現一些比較奇怪的現象,比如下面代碼:

local t1 = ngx.now()
for i=1,1000000 do
end
local t2 = ngx.now()
print(t1, ",", t2) -- 輸出1487053211.321,1487053211.321
ngx.exit(200)

正常來說,t2應該大於t1才對,但由於nginx沒有及時更新(緩存的)時間戳,所以導致t2和t1獲取到的時間戳是一樣的。那么怎樣才能強迫nginx更新緩存呢?調用多一個ngx.update_time()函數即可:

local t1 = ngx.now()
for i=1,1000000 do
end
ngx.update_time()
local t2 = ngx.now()
print(t1, ",", t2) -- 輸出1487054647.584,1487054647.586
ngx.exit(200)

可見,獲取到的時間戳已經發生了改變。
————————————————
版權聲明:本文為CSDN博主「自由de單車」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/ljfrocky/java/article/details/55052079


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM