Lua-resty-Redis如何封装成长尾,实现高效查询?

2026-03-31 22:421阅读0评论SEO教程
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计347个文字,预计阅读时间需要2分钟。

Lua-resty-Redis如何封装成长尾,实现高效查询?

搜索了别人的封装代码,感觉不够优雅。主要问题是+set_keepalive+的调用时机不太理想。我自己的代码是利用+coroutine+,每次+phase+结束时自动调用+set_keepalive+。本地redis配置为+require+ resty.red。

Lua-resty-Redis如何封装成长尾,实现高效查询?

搜了一下别人的封装代码,感觉不够优雅,主要是 set_keepalive 的调用时机不太好
我自己下面的代码是利用 coroutine, 每次当前 phase 结束后自动调用 set_keepalive

local redis = require "resty.redis" local M = {} local function set_keepalive(p, red, opts) while true do if 'dead' == coroutine.status(p) then break end ngx.sleep(0.01) end ok, err = red:set_keepalive(opts.freetime, opts.poolsize) if not ok then ngx.log(ngx.ERR, "failed to set keepalive: ", err) return end end function M:new(opts) opts = opts or {} opts.ip = opts.ip or '127.0.0.1' opts.port = opts.port or 6379 opts.db = opts.db or 0 opts.timeout = opts.timeout or 1000 opts.poolsize = opts.poolsize or 100 -- 连接池大小 100 个 opts.freetime = opts.freetime or 10 * 1000 -- 最大空闲时间 10s local red = redis:new() red:set_timeout(opts.timeout) local ok, err = red:connect(opts.ip, opts.port) if not ok then ngx.log(ngx.ERR, "failed to connect redis: ", err) return ok, err end -- local count, err = red:get_reused_times() -- ngx.log(ngx.ERR, "redis get_reused_times: ", count) local ok, err = red:select(opts.db) if not ok then ngx.log(ngx.ERR, "failed to select redis db: ", err) return ok, err end local t, err = ngx.thread.spawn(set_keepalive, coroutine.running(), red, opts) if not t then ngx.log(ngx.ERR, "failed to spawn thread set_keepalive: ", err) return t, err end return red end return M

本文共计347个文字,预计阅读时间需要2分钟。

Lua-resty-Redis如何封装成长尾,实现高效查询?

搜索了别人的封装代码,感觉不够优雅。主要问题是+set_keepalive+的调用时机不太理想。我自己的代码是利用+coroutine+,每次+phase+结束时自动调用+set_keepalive+。本地redis配置为+require+ resty.red。

Lua-resty-Redis如何封装成长尾,实现高效查询?

搜了一下别人的封装代码,感觉不够优雅,主要是 set_keepalive 的调用时机不太好
我自己下面的代码是利用 coroutine, 每次当前 phase 结束后自动调用 set_keepalive

local redis = require "resty.redis" local M = {} local function set_keepalive(p, red, opts) while true do if 'dead' == coroutine.status(p) then break end ngx.sleep(0.01) end ok, err = red:set_keepalive(opts.freetime, opts.poolsize) if not ok then ngx.log(ngx.ERR, "failed to set keepalive: ", err) return end end function M:new(opts) opts = opts or {} opts.ip = opts.ip or '127.0.0.1' opts.port = opts.port or 6379 opts.db = opts.db or 0 opts.timeout = opts.timeout or 1000 opts.poolsize = opts.poolsize or 100 -- 连接池大小 100 个 opts.freetime = opts.freetime or 10 * 1000 -- 最大空闲时间 10s local red = redis:new() red:set_timeout(opts.timeout) local ok, err = red:connect(opts.ip, opts.port) if not ok then ngx.log(ngx.ERR, "failed to connect redis: ", err) return ok, err end -- local count, err = red:get_reused_times() -- ngx.log(ngx.ERR, "redis get_reused_times: ", count) local ok, err = red:select(opts.db) if not ok then ngx.log(ngx.ERR, "failed to select redis db: ", err) return ok, err end local t, err = ngx.thread.spawn(set_keepalive, coroutine.running(), red, opts) if not t then ngx.log(ngx.ERR, "failed to spawn thread set_keepalive: ", err) return t, err end return red end return M