database之Redis连接池与Lambda
小虾米
阅读:43
2025-06-02 22:19:02
评论:0
我正在尝试将Redis与lambda函数一起使用。如果lamdba无法维持状态,我该如何使用它。始终让lambda与redis建立新连接可以吗?还是可以使用下面粘贴的连接池示例?我将在Handle函数的哪个位置执行conn:= pool.Get()。不知道我应该采取什么方法。任何帮助。
func Handle(ctx context.context, req events.APIGatewayWebsocketProxyRequest)(interface{},error){
//make new redis connection
}
或者
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
redisServer = flag.String("redisServer", ":6379", "")
)
func main() {
flag.Parse()
pool = newPool(*redisServer)
...
}
请您参考如下方法:
尽管不是完美的解决方案(例如AWS RDS Proxy),但在lambda的处理程序之外创建连接池似乎是最好的选择。实际的技术取决于您的语言/环境,因为您还可以延迟初始化连接池并将其保存到类变量,单例等中。在您的示例中,请在lambda处理函数中的任何位置使用全局pool变量。
var (
pool *redis.Pool
redisServer = flag.String("redisServer", ":6379", "")
)
func newPool(addr string) *redis.Pool {
...
}
func HandleRequest(ctx context.Context, name MyEvent) (string, error) {
conn := pool.Get()
defer conn.Close()
err = conn.Send("ZINCRBY", ...)
if err != nil {
return err
}
...
}
func main() {
flag.Parse()
pool = newPool(*redisServer)
lambda.Start(HandleRequest)
}
检查
this Redislabs article了解更多信息。
AWS lambda的处理模型非常简单。只要有请求到来(从API网关,Kinesis流等调用lambda),lambda的生命周期管理代码就可以使lambda保持 Activity 状态,因为它会同步循环遍历这批请求。当此单线程解决方案无法跟上传入的处理请求时(通过不断检查某些延迟指标),lambda的生命周期管理器将创建更多的lambda。因此,从某种意义上说,当需要处理的工作量很大时,您的lambda将需要一段时间,也就是说,无论如何,您都希望保守服务器的免费连接。
声明
1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。



