【问题标题】:how redis/memcached caching is different from Etag caching ?redis/memcached 缓存与 Etag 缓存有何不同?
【发布时间】:2018-05-18 05:43:59
【问题描述】:

我可以看到 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);

【问题讨论】:

    标签: node.js redis memcached etags


    【解决方案1】:

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

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


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

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

    【讨论】:

      猜你喜欢
      • 2018-02-14
      • 2011-03-06
      • 2012-08-30
      • 2018-09-02
      • 2014-05-01
      • 1970-01-01
      • 2015-01-18
      • 2020-09-04
      • 2010-11-22
      相关资源
      最近更新 更多