在Node.js中,为什么我更喜欢键值存储在应用程序variables?

我正在Node.JS中开发一个支持Socket.IO的实时应用程序,在任何时候都会有几百个用户同时使用这个应用程序,我需要存储关于每个连接客户端的一些基本细节(并且删除这些细节客户端断开连接)。

我已经读过,使用键值存储(如Redis)是存储此类数据的首选。

为什么将数据存储在一个常规的应用内variables(对象,例如var connectedClientsData = {} )与将数据存储在Redis之类的键值存储中相比是不好的?

是否只支持扩展(例如,多个基于NodeJS的应用程序服务器可以连接到一个中央键值存储),还是存在一些更严重的缺陷?

有几个问题在玩:

1)是的,缩放。 不只是多个服务器,而且还通过类似“群集”(你可以在npm上find)的多个CPU。

2)V8目前基于其基于浏览器的传统存在限制。 它们在某种程度上是可调的,在V8的下一个版本中会被彻底删除,但还是需要考虑。

另外,你更有可能重启你的节点进程(更新你的应用程序),而不是重启redis,从而失去了所有的会话。

  • 数据持久性 – 您的数据被持久保存在更可靠和持久的存储中,这是为了处理这个问题而build立的。 例如,redis具有磁盘上数据集的快照,并支持高级数据结构,在操作数据时为您提供更多select。

  • 数据集中 – 您的数据存储在中央位置,不仅您的主应用程序,而且其他应用程序都可以访问它并使用这些数据进行操作。 例如,如果您需要在两个系统之间共享状态/数据,那么使用专门用于此目的的KV存储更简单。

  • 卸载你的主应用程序 – 当你使用KV商店时,你正在卸载你的主应用程序,这可以提高性能并显着降低内存消耗。 然后缩放您的主应用程序可以更简单。

  • KV商店的可扩展性 – 许多KV商店都具有内置的扩展function,否则在主应用程序中实现更复杂(例如在应用程序的多个实例之间共享状态)。 这个function也被广泛的testing和logging,所以你不必关心这些事情。

据说键值存储比存储关系数据库更好地存储持久数据,而不是与非持久存储对象进行比较。

但是我怀疑键值数据库与对象variables相比有优势,即使不需要持久化也是如此。 它们可以在应用程序之间共享,并可以节省内存消耗。 即使将所有值存储在内存中的Redis也可以节省应用程序服务器的内存,因为在消耗大量千兆字节时,可以将其迁移到另一台服务器。

此外,内存中的共享对象往往会随着时间的推移而变得复杂。 如果你决定使用它,我build议你抽象它的性质。 有一个对象,你只是在你的代码中做这样的事情:

 var storage = new Storage(); storage.registerClientDisconnection("client_id_1"); 

然后,您的Storage.registerClientDisconnection()可以是

 Storage.proptotype.registerClientDisconnection = function(clientId) { this.info[clientId].connected = false; }; 

要么

 Storage.proptotype.registerClientDisconnection = function(clientId) { var client = redis.createClient(); client.set("clientId:"+clientId+":connected", false); }; 

总结:我会推荐使用一些键值存储,但我敢打赌你也可以使用一些对象存储。 但是,如果您决定使用内存中的对象,则只需提取此实现详细信息,以便将来可以轻松地为键值存储实现进行迁移。 抽象你的决定似乎比你关于实施的决定更重要。