Hello!
2012/12/3 qiongqizhizhu:
> 发现有一个client日志一直在报舍弃,client的校验戳为大于1000000的数,如1012348,这个时候,server里对应这个client的校验戳为999999,不在增加,舍弃了之后所有的请求,是不是很奇怪?
此时你的 redis 服务器里实际存储的值为多少?(你可以使用 redis-cli 或者 telnet 这样的客户端直接获取。)
> 相关代码为:
> local stamp = uri_args['stamp']
> local res, err = fifo:hgetall(process_key)
> res = redis:array_to_hash(res)
> local processing_key = res['processing']
>
> if stamp <= processed_key then
> ngx.status = 200;
> ngx.say(stamp .. "has been processed!");
> ngx.exit(ngx.HTTP_OK)
> end
>
> local res = ngx.location.capture(method, {ctx = request_args})
> ngx.exit(ngx.HTTP_OK)
>
你能尝试提供一个最小化的能复现此问题的用例吗?
我依照你的描述和你提供的代码片段自制了一个小用例,在我的 Linux x86_64 系统上工作正常:
location = /t {
content_by_lua '
local say = ngx.say
local redis = require "resty.redis"
local red = redis:new()
red:set_timeout(1000) -- 1 sec
local ok, err = red:connect("127.0.0.1", 6379)
if not ok then
say("failed to connect: ", err)
return
end
local res, err = red:hset("myhash", "field", 1012348)
if not res then
say("hset failed: ", err)
return
end
local res, err = red:hincrby("myhash", "field", 1)
if not res then
say("hincrby failed: ", err)
return
end
local res, err = red:hgetall("myhash")
if err then
say("get failed: ", err)
return
end
local tb = red:array_to_hash(res)
say("new field value: ", tb.field)
red:close()
';
}
访问 /t 得到输出
new field value: 1012349
你能在你那里尝试此用例吗?
Thanks!
-agentzh