收藏
回答

云函数连接redis,云函数执行完成后要断开redis连接吗

框架类型 问题类型 终端类型 AppID 环境ID 基础库版本
小程序 Bug 微信安卓客户端 1 1 2.0.0

按照云开发扩展应用 redis 中的介绍,云函数代码如下,redis 连接在 main 函数之外,在 main 函数返回之后,没有断开 redis 连接,redis 连接会跟云函数实例一起留存,直到云函数实例被销毁。

const Redis = require('ioredis');

const redis = new Redis({
  port: process.env.REDIS_PORT,
  host: process.env.REDIS_HOST,
  password: process.env.REDIS_PASSWORD,
});

exports.main = async () => {
  let res = await new Promise((resolve) => {
    redis.get('test', function (err, reply) {
      if (err) {
        resolve({ err });
      }
      resolve({ data: reply });
    });
  });

  return { res };
};

结合云函数的运行机制,官方建议把同一个 redis 实例读写操作集合到一个云函数,这样在云函数实例被复用时,也可以复用 redis 连接,减少连接数。

但是,在调用云函数时,发现云函数运行在 Node.js 8.9 和 Node.js 10.15 上表现不同,在 Node.js 10.15 环境下,main 函数返回结果之后,云函数会继续等待异步任务执行完毕,但 redis 连接一直没有断开,所以会一直等待直到超时,报错如下:

{"errorCode":-1,"errorMessage":"Async invoking task timed out after 10 seconds","statusCode":433}


https://cloud.tencent.com/document/product/876/41764

云函数文档上介绍了 Node.js 8 和 Node.js 10 的不同,那么 Node.js 10 环境下,必须在 main 函数返回结果前断开 redis 连接吗?

Node.js 8.9 环境下,云函数实例被销毁后,redis 连接会自动断开吗?

综合考虑复用 redis 连接和节省云函数资源,是否更建议使用 Node.js 8.9 环境连接 redis?

回答关注问题邀请回答
收藏

1 个回答

  • Mr.Zhao
    Mr.Zhao
    2023-06-12

    不主动断开 会持续计费

    2023-06-12
    有用
    回复 4
    • 佳梨
      佳梨
      2023-06-12
      redis 实例运行后就一直在计费吧,不是按连接时长计费
      2023-06-12
      1
      回复
    • Mr.Zhao
      Mr.Zhao
      2023-06-12回复佳梨
      云函数用完redis要断开redis,本来用3秒返回结果,不断开云函数就会一直计费到超时时间
      2023-06-12
      回复
    • 佳梨
      佳梨
      2023-06-12回复Mr.Zhao
      Node.js 8.9 云函数主流程执行完成返回结果后就会冻结,不会超时报错,一定时间内再次调用会复用函数实例和 redis 连接。Node.js 10.15 会一直运行到超时,所以必须断开 redis。我是这么理解的
      2023-06-12
      回复
    • Mr.Zhao
      Mr.Zhao
      2023-06-12回复佳梨
      redis放到异步请求里面 当此会被冻结,等到下次调用,这样数据就会错误,A用户的信息被B用户获取了  而且8版本要下线了
      2023-06-12
      回复
登录 后发表内容
问题标签