1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95
| local request_method = ngx.var.request_method local args = nil local param = nil
if request_method == 'GET' then args = ngx.req.get_uri_args() elseif request_method == 'POST' then ngx.req.read_body() args = ngx.req.get_post_args() end
local user_id = args["user_id"]
local function close_redis(redis_instance) if not redis_instance then return end local ok,err = redis_instance:close() if not ok then ngx.say('Redis server close failed: ', err) end end
local limit_req = require "resty.limit.req"
local lim,err = limit_req.new("my_limit_req_store", 50, 1000) if not lim then ngx.say('Failed to instantiate a resty.limit.req object:',err) return end
local key = ngx.var.remote_addr ngx.say('key is: ',key,'<br/>') local delay,err = lim:incoming(key, true) ngx.say('delay is: ', delay,'<br/>')
if not delay then if err == 'rejected' then return ngx.say('1000 over, spill them all!') end ngx.log(ngx.ERR, 'failed to limit req: ',err) ngx.say(ngx.ERR, 'failed to limit req: ',err,'<br/>') return ngx.exit(502) end
if delay>10 then ngx.say('delay time over time!','<br/>') return end
local redis = require 'resty.redis' local redis_instance = redis:new()
redis_instance:set_timeout(1000) local ok,err = redis_instance:connect("192.168.253.135",6379) if not ok then ngx.say('failed to connection with redis',err,'<br/>') return end
local resp, err = redis_instance:get('sku_num') resp = tonumber(resp) ngx.say('goods number sku_number is : ', resp, '<br/>') if resp>0 then ngx.say('sec_kill success','<br/>') redis_instance:watch('watch_key') ngx.sleep(1) local ok,err = redis_instance:multi(); local sku_num = resp - 1 ngx.say('goods number sku_number now is : ', sku_num, '<br/>') redis_instance:set('sku_num', sku_num) redis_instance:set('watch_key', 1) ans,err = redis_instance:exec() ngx.say('Redis response is : ', tostring(ans), '--', '<br/>') if tostring(ans) == 'userdata: NULL' then ngx.say('purchase failed, please earlier next', '<br/>') return else ngx.say('purchase success!', '<br/>') return end else ngx.say('sec_kill failed!', '<br/>') end
|