3

我可以看到 restful 有一个名为 Etags 的内置缓存机制,那么为什么我们需要使用 redis 或 memcached 缓存端点。加上 etags 我们可以检查资源是否已修改。

这是示例 redis 缓存代码

const getBook = (req, res) => {
  let isbn = req.query.isbn;
  let url = `https://www.googleapis.com/books/v1/volumes?q=isbn:${isbn}`;
  return axios.get(url)
    .then(response => {
      let book = response.data.items;
      // Set the string-key:isbn in our cache. With he contents of the cache : title
      // Set cache expiration to 1 hour (60 minutes)
      client.setex(isbn, 3600, JSON.stringify(book));

      res.send(book);
    })
    .catch(err => {
      res.send('The book you are looking for is not found !!!');
    });
};

const getCache = (req, res) => {
  let isbn = req.query.isbn;
  //Check the cache data from the server redis
  client.get(isbn, (err, result) => {
    if (result) {
      res.send(result);
    } else {
      getBook(req, res);
    }
  });
}

app.get('/book', getCache);

4

1 回答 1

1

Redis 不会缓存您的端点。它正在缓存端点内完成的工作。在此示例中,Redis 被用作内部数据存储,以保存 Google 查询 ISBN 的结果。这是一种加快/book端点速度的记忆技术。

完成此查询的工作并生成资源(您的自定义图书响应)后,您就可以为您提供给客户的最终资源创建 ETag。


Redis 通常使用时间戳来提供较小的动态内容(计算、对象、模板),以用于近实时和实时应用程序。如果您知道资源何时更改,则最好将其用作缓存。然后您可以撤出缓存,并使用新值填充它。它可以设置过期标头以防止将来对同一资源的请求。只有缓存未命中是昂贵的。

实体标签 (ETags) 不是缓存。它们可以防止您的服务器浪费处理和带宽。ETag 是资源的 MD5 哈希,通常用于较大的静态内容:图形、样式表、脚本、渲染页面和视频。如果您不知道资源何时更改,或者您无法控制缓存,则最好使用 ETag 。您的资源服务器将在第一个响应中设置一个 ETag 标头。当客户端请求具有相同散列的资源时,服务器只能使用标头响应:304 Not Modified。只有第一个电话是昂贵的。

于 2021-08-05T00:13:56.343 回答