場景:
以下是 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 自己定義的隨機生成函式,替換也就是說,如果不改變randomseed,random返回的序列會總是相同的,所以會拿到同樣的值。math
表原有的math.random
函式和math.randomseed
函式,新的函式具有這樣的性質:每次執行 lua 指令碼時,除非顯式地呼叫math.randomseed
,否則math.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...