kong 插件使用Redis遇到的问题

参考: 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

你可能感兴趣的:(kong 插件使用Redis遇到的问题)