使用 SailsJS/Express 在请求之间将对象保存在内存中

Keep Object In Memory Between Requests with SailsJS/ Express

我正在使用 SailsJS(一个构建在 Express 之上的框架)构建一个服务器,我需要在请求之间将一个对象保存在内存中。我想这样做是因为将它加载到数据库/从数据库加载时间太长。有什么想法可以做到这一点吗?

这是我的代码:

var params = req.params.all();

Network.findOne({ id: params.id }, function(err, network) {
  if(network) {
    var synapticNetwork = synaptic.Network.fromJSON(network.jsonValue);
    if(synapticNetwork) { ...

具体来说,fromJSON() 函数花费的时间太长,我宁愿在服务器 运行 时将 synapticNetwork 对象保留在内存中(也就是在服务器启动时加载它并定期保存)。

有很多用于缓存目的的库,其中之一是您提到的 node-cache。他们都有相似之处 api :

var cache = require('memory-cache');

// now just use the cache

cache.put('foo', 'bar');
console.log(cache.get('foo'))

您也可以实现自己的模块,并在任何需要的地方使用它:

var cache = {};

module.exports = {
    put: function(key, item) {
        cache[key] = item;
    },
    get: function(key) {
        return cache[key];
    }
}

有很多潜在的解决方案。第一个也是最明显的一个是使用一些会话中间件来表达。大多数网络框架应该有某种会话解决方案。

https://github.com/expressjs/session


下一个选项是使用像 Vsevolod 建议的缓存实用程序。它完成与会话几乎相同的事情,除非数据需要绑定到 user/session 然后你必须在会话中存储某种标识符并使​​用它从缓存中检索。如果这是您的用例,我认为这有点多余。

还有一些实用程序可以扩展您的会话中间件并将会话中的对象持久保存到数据库或其他类型的数据存储中,这样即使在服务器重新启动后会话信息也不会丢失。您仍然可以获得内存存储的速度,但有数据库支持,以防内存存储被炸毁。


另一种选择是使用 Redis。您仍然需要 serialize/deserialize 您的对象,但 Redis 是一种内存数据存储,读写速度非常快。