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将需要一段时间,也就是说,无论如何,您都希望保守服务器的免费连接。


标签:Redis
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

关注我们

一个IT知识分享的公众号