gpt4 book ai didi

node.js - 使用 redis 作为 REST Api 用户的缓存(为了保存 Api 请求)

转载 作者:可可西里 更新时间:2023-11-01 11:12:59 26 4
gpt4 key购买 nike

我是 API 用户,对于高流量网站(约 1k 并发访问者),我只有有限数量的可用请求。为了保存 API 请求,我想缓存不太可能更改的特定请求的响应。

但是我想至少每 15 秒刷新一次此 redis key (API 响应)。我想知道最好的方法是什么?

我的想法:

  • 我认为 TTL 字段对于这种情况会很方便。只需为此键设置 15s 的 TTL。当我查询此 key 但它不存在时,我会使用 API 再次请求它。 问题:由于这是一个高流量网站,在我收到来自 API 的响应之前,我预计会收到大约 20-30 个请求,这将导致在短短时间内对 API 发出 20-30 个请求小姐。所以我需要“暂停”所有传入的请求,直到有 API 响应为止
  • 我的第二个想法是每 15 秒刷新一次 key 。我可以设置一个每 15 秒运行一次的后台任务,或者根据页面请求我可以检查我的 Controller 是否需要刷新 key 。我更喜欢最后一个想法,但因此我需要维护 redis key 年龄,这似乎非常昂贵,而且它不是内置功能?

对于这个用例,您有什么建议?

我的 Controller 代码:

function players(req, res, next) {
redisClient.getAsync('leaderboard:players').then((playersLeaderboard) => {
if(!playersLeaderboard) {
// We need to get a fresh copy of the playersLeaderboard
}

res.set('Cache-Control', 's-maxage=10, max-age=10')
res.render('leaderboards/players', {playersLeaderboard: playersLeaderboard})
}).catch((err) => {
logger.error(err)
})
}

最佳答案

只需在 node.js 服务器启动时获取并缓存数据,然后设置 15 秒的时间间隔来获取新数据并更新缓存。避免将 TTL 用于此用例。

function fetchResultsFromApi(cb) {
apiFunc((err, result) => {
// do some error handling
// cache result in redis without ttl
cb();
});
}

fetchResultsFromApi(() => {
app.listen(port);
setInterval(() => {
fetchResultsFromApi(() => {});
}, 15000);
}

优点:

  1. 实现起来非常简单
  2. 无需排队等待客户请求
  3. 超快的响应时间

缺点:

  1. 缓存更新可能不会在每 15 秒后准确执行/完成。可能到处都是几毫秒。我认为这不会对您正在做的事情产生太大影响,您始终可以在 15 秒之前减少更新缓存的间隔时间。

关于node.js - 使用 redis 作为 REST Api 用户的缓存(为了保存 Api 请求),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45403774/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com