zoukankan      html  css  js  c++  java
  • openresty lua-resty-redis 封装 a wrapper for 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
    
    
    
    
  • 相关阅读:
    html+php超大视频上传功能
    html+php超大视频上传教程
    html+php超大视频上传方案
    html+php超大视频上传技术
    html+php超大视频上传实例解析
    html+php超大视频上传示例
    html+php超大视频上传实例
    矩阵求导
    概率密度
    概率分布函数
  • 原文地址:https://www.cnblogs.com/hangj/p/11580698.html
Copyright © 2011-2022 走看看