参考: https://juejin.im/post/6844904197662441486
执行阶段限制:resty.redis 不能在 init_by_lua, set_by_lua, log_by_lua, and header_filter_by_lua 这些阶段执行。对应到kong,就是init_worker() header_filter() log() 等函数里不可用使用该redis客户端
resty.redis 的实例不能作为模块级别的变量使用,需要将它作为一个函数级的局部变量。比如local redis = require "restry.redis" 就需要再access函数内去执行,而不是一个独立的module内去执行
不光如此,在尝试以上方法添加到body_filter phase时任然会报错,最终解决的办法是使用ngx.timer.at,在延时方法内实现redis数据操作,例如:
local delay = 0
local jwt_token = kong.ctx.shared.jwt
local jwt_timestamp = jwt.get_timestamp()
local redis_key = kong.ctx.shared.redis_key
local handler = function()
local restry_redis = require "resty.redis"
local red = restry_redis:new()
red:set_timeouts(1000, 1000, 1000)
kong.log.inspect("response_body=====redis_log")
local ok, err = red:connect(os.getenv("REDIS_HOST"), os.getenv("REDIS_PORT"))
if not ok then
kong.log.inspect("response_body=====redis_connect error", err, os.getenv("REDIS_HOST"), os.getenv("REDIS_PORT"))
return nil
else
kong.log.inspect("redis key=====", redis_key, jwt_token, jwt_timestamp)
red:hmset(redis_key, "jwt", jwt_token, "jwt_timestamp", jwt_timestamp, "new_account", "t")
red:expire(redis_key, 60)
red:set_keepalive(10000, 100)
end
end
local ok, err = ngx.timer.at(delay, handler)
if not ok then
ngx.log(ngx.ERR, "failed to create the timer: =======", err)
return
end