1. 程式人生 > >nginx lua讀redis

nginx lua讀redis

  • 國內企業使用nginx的還是挺多的,我在工作的過程中,也經常使用nginx;下面就簡單記錄一下lua訪問redis
    local cjson = require "cjson"
    local redis = require "resty.redis"
    local red = redis:new()  
    
    -- 設定後續操作的超時(以毫秒為單位)保護,包括connect方法
    red:set_timeout(60000) 
    -- 連線redis;兩個引數分別是IP以及埠號
    local ok, err = red:connect("xxx.xxx.xxx.xxx", 6379) 
    if not ok then
        return
    end
    -- 設定連線密碼
    red:auth("xxxx")
    -- 切換資料庫,不設定,預設是0庫
    red:select(1)
    
    local json_results={}
    
    local request_method = ngx.var.request_method
    if request_method == "GET" then
        json_results["userTag"] = 0
        local value = cjson.encode(json_results)
        ngx.say(value) 
        return
    elseif request_method == "POST" then
        ngx.req.read_body()
        args= ngx.req.get_body_data()
    end
    
    local arg=cjson.decode(args)
    
    if (type(arg["userIdList"]) == "nil") or (arg["userIdList"] == "") then 
        json_results["userTag"] = 0
        local value = cjson.encode(json_results)
        ngx.say(value) 
        return
    end
    
    local useridList = {}
    -- 設定為pipeline()模式;批量獲取value
    red:init_pipeline()
    for k,userid in pairs(arg["userIdList"]) do
        useridList[k] = userid
        red:get("taonewslabel_"..userid)
    end
    -- 提交所有的key
    local respTable, err = red:commit_pipeline()  
    
    -- local res, err = red:get(userid) 或者這種一次獲得一個key
    
    if (not respTable) or  respTable == ngx.null then
        json_results["userTag"] = 0
        local value = cjson.encode(json_results)
        ngx.say(value) 
        return
    end
    
    local i = 0
    local res_userid={}
    -- 對有值的key的處理
    for k, v in pairs(respTable) do  
         if v ~= ngx.null then 
            res_userid[#res_userid+1] = cjson.decode(v)
            table.remove(useridList,k-i)
            i = i + 1
         end
    end 
    -- 對無值的key的處理
    for k,userid in pairs(useridList) do
        local k_v={}
        k_v["error_code"] = 101
        k_v["userid"] = userid
        res_userid[#res_userid+1] = k_v
    end
    
    json_results["userTag"] = res_userid
    local value = cjson.encode(json_results)
    ngx.say(value) 
    red:close()