我在lambda函数中使用golang连接到Redis。当我第一次调用lambda时,将创建一个新的连接池,并进一步调用lambda似乎使用该池来获取连接。但是,当我添加con.close()行时,对lambda的第二次调用将崩溃,而第三次调用将重新创建池。如果我不关闭连接,会有任何风险吗?还是可以通过其他方式关闭连接?
我在云监视日志上得到的错误是行池上的“运行时错误,无效的内存地址或nil指针。Get()好像池变量为nil?
func newPool(addr string) *redis.Pool {
return &redis.Pool{
MaxIdle: 3,
IdleTimeout: 240 * time.Second,
// Dial or DialContext must be set. When both are set, DialContext takes precedence over Dial.
Dial: func () (redis.Conn, error) { return redis.Dial("tcp", addr) },
}
}
var pool *redis.Pool
func init(){
pool = newPool()
}
func Handle(ctx context.context, req events.APIGatewayWebsocketProxyRequest)(interface{},error){
//make new redis connection
con:= pool.get()
con.close()
}
如何在Handle函数中添加defer con.close()
?因为在调用Handle函数后,它将关闭con。
似乎您在打开连接后就立即关闭了连接,因此是的Lambda会杀死自己。
您可以通过某种循环使连接保持活动状态,处理您的消息然后退出循环以关闭连接。然后,这又会再次杀死Lambda。
您可以将lambda设置为long-lived,这样只会增加费用。
一旦您的Handle方法完成,lambda就会杀死自己。