我正在使用 ioredis
到 set
值到 Redis 企业实例。
ip:port
上运行以防止创建其他实例import * as functions from "firebase-functions";
import Redis = require("ioredis");
const redis = new Redis("redis://default:jMSNpTm3JXs1@redis-15360.c228.us-central1-1.gce.cloud.redislabs.com:15360");
export const SaveRecord = functions.https.onCall(async (data,context)=>{
const {record,recordID} = data;
try{
var result = await redis.multi().set(recordID, record).expire(recordID,3600).exec();
return result;
}catch(e){
console.log(e);
return "error";
}
})
答案 0 :(得分:1)
我从未在我的项目中部署过 Redis Cloud Enterprise,但我已经可以提供这些答案
1,2,3。您不需要在每次连接时都关闭连接。在您的代码中,您开始(第 4 行)与 Redis 的连接,并将其存储在全局变量中(在全局范围内,而不是在函数体中)。
这意味着,当 Cloud Functions 实例启动时,它会调用所有全局代码(您的前 4 行,然后调用您的函数。redis
变量保留在 Cloud Functions 调用之间。
但是,您需要检查 redis Cloud 默认连接超时并能够在连接关闭的情况下执行重新连接(代码中的异常处理)。
关于关闭连接,也要看Redis Cloud的配置:空闲连接是否自动关闭?如果没有,那就很难了。尝试在空闲活动 1 小时或更短时间后通过 Redis 服务器配置关闭空闲连接。 (Cloud Functions 实例通常会在 30 分钟不活动后卸载,无需任何 Google Cloud 承诺。
是的;如果您检查在您的 URL 上注册的 IP(例如 nelookup redis-15360.c228.us-central1-1.gce.cloud.redislabs.com
),您将在 172.26.x.x 中找到一个 URL。这是一个 RFC 1918 私有 IP。 DNS 解析是外部的(向 redislab URL 询问服务器的 IP),但目标服务器在您的项目内部。您只能路由内部流量。
Cloud Functions 服务根据 HTTP 流量创建和销毁实例。您无法阻止实例的创建或销毁,它是无服务器的。同样,您没有与 Cloud Functions 实例关联的 IP/PORT,它是无服务器的。如果您只想拥有 1 个 Cloud Functions 实例,则可以将 max instance 设置为 1。但是,请注意,Cloud Functions 在同一实例上一次只能处理 1 个请求。最大实例数为 1,是否有 2 个并发请求,1 个将被处理,另一个将等待,10 秒后将返回 417 HTTP 错误。