func_redis.lua 代码如下:
local _M = {}
local redis = require("resty.redis")
local api_path = require('common/api_path')
local ip = api_path.redis['ip']
local port = api_path.redis['port']
local dbNum = api_path.redis['dbnum']
local auth = api_path.redis['auth']
local timeout = 10000
local isconnect = false
local max_idle_time = 60000
local pool_size = 10
function _M.exec(func)
--创建实例
local red = redis:new()
-- 设置超时
red:set_timeout(timeout)
local ok, err = red:connect(ip, port)
if not ok then
log.local_println("redis","Cannot connect, host: " .. ip .. ", port: " .. port)
return nil, err
end
if auth ~= nil then
--连接密码
red:auth(auth)
end
-- 选择操作的数据库
red:select(dbNum)
local res, err = func(red)
if res then
local ok, err1 = red:set_keepalive(max_idle_time, pool_size)
if not ok then
log.local_println("redis","red close: ")
red:close()
end
end
return res, err
end
function _M.func_redis(redisKey)
local res, err = _M.exec(
function(red)
return red:get(redisKey)
end
)
if not res then
return nil
end
if type(res) == "userdata" then
return nil
end
return res
end
function _M.save_redis(redisKey,redisValue,expires)
local res, err = _M.exec(
function(red)
local ok, err = red:set(redisKey, redisValue)
red:expire(redisKey, expires)
return ok, err
end
)
if not res then
return nil
end
return res
end
return _M
api_path.lua
local _M = {
redis={ip="192.168.10.10",port="7000",dbnum=2,auth=nil}
}
return _M
local redisKey "lily."..aId..".label."..labelid..".size."..size
local message = nil
--获取redis中数据
message = redis.func_redis(redisKey)
local redismsg = redis.save_redis(redisKey,value,3600*4)
redis 是非关系性数据库
1.我们是在什么情况下使用的keepalive:
keepalive是在redis已经建立了连接,并进行相关值请求以后执行的!!!
我们在使用lua连接redis的时候,期望它自身具备以下几个特征:
new、connect 函数合体,使用时只负责申请,尽量少关心什么时候具体连接、释放;
默认 Redis 数据库连接地址,但是允许自定义;
每次 Redis 使用完毕,自动释放 Redis 连接到连接池供其他请求复用;
2.什么是连接池?用来干什么?
连接池可以理解为方便我们操作数据库的中间方法。其方便之处在于不用我们每次都写要连接哪个机器,端口号等等的操作。同时在连接池中可以写很多便于我们对连接池操作的方法,或者对整个请求的优化。
数据库连接池在初始化时将创建一定数量的数据库连接放到连接池中(连接池的概念)。也就是说建立了连接以后复用tcp连接 避免频繁建立连接的开销。维系这些连接,不让连接被断开。
3.keepalive中大小对连接池有什么影响?是不是越大越好?
长连接其实就是建立了一次连接 然后中间redis的命令都能一直使用,每次使用都不需要重新建立一个连接,这样可以减少建立redis连接时间。也就是说请求redis连接的数量,不分长短。
连接的数量就是连接池的大小,redis配置中最大允许1w个连接。当应用程序中的并发连接数超过redis/mc服务器端的允许的连接数时,对redis/mc进行扩容为最佳方案,保证db能够提供高性能服务。
我们可以认为 连接池越大,就具有更高的性能。当然,连接池的大小并不是在可控范围内越大越好。服务器端维持很大的连接数,一方面需要消耗很多的进程资源,对于单进程的redis或者twemproxy(解决redis集群的一个工具),需要占用进程的调度时间;另外,过多的空闲连接数对于db的容量评估也带来错误性的判断。
4.客户端连接池的配置要点。
1) 连接池的大小。单个应用程序中,接口的并发的连接数的1.5倍足够满足需求。
2) 保持一定的空闲连接数,这样可以保证客户端可快速的获取连接对象。
3) 合理设置空闲接的回收时间。避免客户端维持大量的空闲连接。 4) 定时检查长连接对象的有效性。主要是防止网络抖动或者db端出现异常时主动关闭连接。