原創自由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