Redis呼叫lua生成驗證碼

2022-04-28 16:18:06 字數 1014 閱讀 4782

場景:

以下是 php 呼叫 redis.eval 方法傳入的 lua 方法,當然這只是修改後的,保留了主要邏輯

local time = 1542363164 // unix時間戳

local code = redis.call('get',1)

if (code) then

return code

else

local i = 0

while(true) do

math.randomseed(time+i)

code = math.random(100000,999999)

if (1 == redis.call('setnx',1,code)) then

return code

endend

endreturn 0

乍一看沒問題,但是要知道 redis 在建立 lua 環境的時候,第6步是這樣的(具體為什麼是這樣的

用 redis 自己定義的隨機生成函式,替換math表原有的math.random函式和math.randomseed函式,新的函式具有這樣的性質:每次執行 lua 指令碼時,除非顯式地呼叫math.randomseed,否則math.random生成的偽隨機數序列總是相同的。

也就是說,如果不改變randomseed,random返回的序列會總是相同的,所以會拿到同樣的值。

這就需要考慮乙個場景:

​ 一秒內有600個使用者同時訪問,randomseed會一直增加到time+600,會把未來10分鐘的時間戳都占用。一秒內請求越多,占用未來時間戳越多,迴圈時間就越長。

​ 就是乙個秒數只能承載乙個使用者的驗證碼,想來想去,決定使用拼接的方式實現math.randomseed(time .. i)這樣乙個秒數可以實現承載更多。

驗證碼一(驗證碼生成)

根據手機好查詢密碼 return type description code for i 0 i 6 i 4位驗證碼也可以用rand 1000,9999 直接生成 將生成的驗證碼寫入session,備驗證時用 session start session verify num code 建立,定義顏色...

生成驗證碼

在此處放置使用者 以初始化頁面 bitmap image new bitmap int math.ceiling validatenum.length 12.5 22 graphics g graphics.fromimage image tryfinally region web 窗體設計器生成的...

生成驗證碼

生成驗證碼的類 using system using system.data using system.configuration using system.collections using system.web using system.web.security using system.web...