节点js库来管理应用程序的响应缓存

时间:2017-10-23 17:12:09

标签: node.js caching

我正在使用Android应用程序的API。他们正在实现一个库(快速安卓网络),如果标题说旧的响应仍然有效,将避免重新获得响应。

现在我正在尝试在我身边实现一个能够检测响应何时发生变化的逻辑。 如果自上次应用程序执行请求后响应已更改,我会设置相应的标头以让应用程序知道其本地响应无效。否则,标题将让应用程序知道他们的本地响应可以安全使用。

该应用程序管理多媒体内容。用户添加自己的内容,分享  内容,订阅内容等。因此,应用程序的响应在很大程度上取决于用户。

考虑到这一点,我不打算缓存回复。我想要做的是告诉应用程序何时必须更新它们在本地存储的响应。

我们之前有过这样的机制。当用户在每个api上发出请求时,我正在存储和更新最近的时间。然后我正在更新一个值,该值指示上一次特定数据集的更改(例如,如果歌曲列表正在更改,或者用户的信息正在更改)。通过这种方式,我能够(通常)了解应用程序是否需要替换其本地响应。

然而,这是大量的手工工作,也许有些库可以更有效地处理它。我一直在搜索,但我找到的所有内容都没有考虑到响应从用户变为用户的事实。

后端位于Node js中。

1 个答案:

答案 0 :(得分:0)

我的解决方案包括使用etags(在Brahma Dev的建议下)。我使用模块crypto生成etag,sha256作为散列算法。在后端,逻辑如下:

var possibilities = [];

//create all possibilities
for (var i = 0; i <= 600; i += 30){
  for (var j = 0; j <= 600; j+= 30) {
    possibilities.push({ x: i, y: j });
  }
}

var actPosX = [300 ,330, 360];
var actPosY = [300 ,300 ,300];

//remove the possibilities already used
actPosX.forEach(function(x, index){
  var possibility = possibilities.find(function(element){
    return (element.x === x && element.y === actPosY[index]);
  });
  
  possibilities.splice(possibilities.indexOf(possibility), 1);
});

//now find a possibility not used yet
var index = Math.floor((Math.random() * possibilities.length * 10) % possibilities.length);

console.log('X: ', possibilities[index].x, ', Y: ', possibilities[index].y);

//put the used possibility in your array
actPosX.push(possibilities[index].x);
actPosY.push(possibilities[index].y);

//remove the possibility
possibilities.splice(index, 1);

//now you're ready to repeat the random logic for your next possibility

应用程序收到响应。如果status_code为304,则忽略响应的其余部分。否则,它会更新为此API存储的etag以及缓存中的数据。如果缓存中没有etag和数据,则应用程序根本不会发送etag。

在下一个请求中,应用程序在其缓存中发送etag。服务器计算新响应的etag。如果它与应用程序上的相同,则表示响应也是相同的。 304作为状态代码发送,并且没有数据被发送回应用程序。如果etag发生了变化,那么数据也会发生变化。另一个状态代码(主要是200,......取决于逻辑)与新数据一起发送。

默认情况下,

Express会生成并发送etags。你可以在这里阅读更多。我们选择自己生成etags有两个原因:

  1. 我们不想使用表达用法的哈希算法(md5和crc32)
  2. Express计算整个响应的哈希值。我们在响应的某些部分可能会在每个响应中发生更改,但它们并不代表应用程序的实际数据。这意味着即使应用程序数据没有变化,我们每次都会得到相同的etag。