對于有授權驗證的 Redis,正確的認證方法,請參考下面例子:
server {
location /test {
content_by_lua_block {
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
ngx.say("failed to connect: ", err)
return
end
-- 請注意這里 auth 的調用過程
local count
count, err = red:get_reused_times()
if 0 == count then
ok, err = red:auth("password")
if not ok then
ngx.say("failed to auth: ", err)
return
end
elseif err then
ngx.say("failed to get reused times: ", err)
return
end
ok, err = red:set("dog", "an animal")
if not ok then
ngx.say("failed to set dog: ", err)
return
end
ngx.say("set result: ", ok)
-- 連接池大小是100個,并且設置最大的空閑時間是 10 秒
local ok, err = red:set_keepalive(10000, 100)
if not ok then
ngx.say("failed to set keepalive: ", err)
return
end
}
}
}
這里解釋一下 tcpsock:getreusedtimes()
方法,如果當前連接不是從內建連接池中獲取的,該方法總是返回 0 ,也就是說,該連接還沒有被使用過。如果連接來自連接池,那么返回值永遠都是非零。所以這個方法可以用來確認當前連接是否來自池子。
對于 Redis 授權,實際上只需要建立連接后,首次認證一下,后面只需直接使用即可。換句話說,從連接池中獲取的連接都是經過授權認證的,只有新創(chuàng)建的連接才需要進行授權認證。所以大家就看到了 count, err = red:get_reused_times()
這段代碼,并有了下面 if 0 == count then
的判斷邏輯。