local cjson = require "cjson";
local config = ngx.shared.config;
local file = io.open("/usr/local/nginx/lua/count.cjson", "r");
local content = cjson.decode(file:read("*all"));
file:close();
for name, value in pairs(content) do
config:set(name, cjson.encode(value));
end
count.cjson
ngx.header.content_type = "text/plain;charset=utf-8"
local request_method = ngx.var.request_method
local args = nil
if "GET" == request_method then
args = ngx.req.get_uri_args()
elseif "POST" == request_method then
ngx.req.read_body()
args = ngx.req.get_post_args()
end
local uri = ngx.var.uri;
uri = string.sub(uri,2,#uri);
local uripos = string.find(uri , '/');
if(uripos == null) then
ngx.say('{"errorCode":500,"errorMsg":"'..conf_tab['count_name']..' 参数错误}');
ngx.exit(200);
end
local type = string.sub(uri , 1 ,uripos-1);
local functionname = string.sub(uri , uripos+1 ,#uri);
local cjson = require "cjson";
local config = ngx.shared.config;
local conf_tab = config:get(type);
if(conf_tab == null) then
ngx.say('{"errorCode":500,"errorMsg":"'..conf_tab['count_name']..' 无此计数类型}');
ngx.exit(200);
end
conf_tab = cjson.decode(conf_tab);
local param_key_all = '';
--检测参数
if(functionname ~= 'get') then
param_key_all = param_key_all..conf_tab['cv_key'];
for key, val in pairs(conf_tab['key']) do
if(args[val] == null) then
ngx.say('{"errorCode":500,"errorMsg":"'..conf_tab['count_name']..' 参数错误}');
ngx.exit(200);
end
param_key_all = param_key_all..':'..args[val];
end
else
if(args['json'] == null) then
ngx.say('{"errorCode":500,"errorMsg":"'..conf_tab['count_name']..' 参数错误}');
ngx.exit(200);
end
local param_tab = cjson.decode(args['json']);
if(param_tab == null) then
ngx.say('{"errorCode":500,"errorMsg":"'..conf_tab['count_name']..' 参数错误}');
ngx.exit(200);
end
for key, val in pairs(param_tab) do
param_key_all = param_key_all..','.."'"..conf_tab['cv_key'];
for i=1,#conf_tab['key'],1 do
if(val[conf_tab['key']] == null) then
ngx.say('{"errorCode":500,"errorMsg":"'..conf_tab['count_name']..' 参数错误}');
ngx.exit(200);
end
param_key_all = param_key_all..':'..val[conf_tab['key']];
end
param_key_all = param_key_all.."'";
end
param_key_all = string.sub(param_key_all,2,#param_key_all);
end
local redis = require("resty.redis");
local red = redis:new();
red:set_timeout(1000); -- 1 sec
local ok, err = red:connect(conf_tab['redis_host'] , conf_tab['redis_port'] );
if not ok then
ngx.say('{"errorCode":500,"errorMsg":"'..conf_tab['count_name']..' REDIS服务器连接错误}')
ngx.exit(200);
end
if(functionname == 'get') then
local cvval = red:eval("return redis.call('mget',"..param_key_all..")",0);
local results = {};
results['data'] = cvval;
results['errorCode'] = 0;
results['errorMsg'] = 'ok';
ngx.say(cjson.encode(results));
elseif(functionname == 'inc') then
cnum=red:incrby(param_key_all,1)
ngx.say('{"errorCode":0,"errorMsg":"ok","data":'..cnum..'}')
elseif(functionname == 'dec') then
cnum=red:incrby(param_key_all,-1);
ngx.say('{"errorCode":0,"errorMsg":"ok","data":'..cnum..'}')
elseif(functionname == 'clear') then
cnum=red:set(param_key_all,0);
ngx.say('{"errorCode":0,"errorMsg":"ok","data":0}')
else
ngx.say('参数错误');
end
red:set_keepalive(0, 100);
View Code