如何在实时应用程序中存储大数据

时间:2019-02-20 05:42:21

标签: javascript node.js sockets

我正在进行一个实时协作画布项目,在这个项目中,用户可以创建房间,其他人可以通过一些ID和密码加入。我的应用程序还支持多个选项卡功能,并且我现在还使用fabric.js来处理画布操作,所以我想以一种方式制作该应用程序,如果用户由于某些互联网问题而与房间断开连接,那么在重新连接后,他可以继续从那里他离开。为此,我需要将数据存储在某个地方,我尝试使用mongoDB进行处理,但是我的画布数据很大,例如300mb或500mb,从mongoDB提取数据需要花费太多时间,因此应用程序的性能非常差。诸如撤消,打开新标签等所有操作都很缓慢。因此,我想知道在这种情况下应该如何管理数据。

这是我的fabric.js对象:

"{\"version\":\"2.4.4\",\"objects\":[{\"type\":\"path\",\"version\":\"2.4.4\",\"originX\":\"left\",\"originY\":\"top\",\"left\":94,\"top\":89.17157287525382,\"width\":4,\"height\":23.83,\"fill\":null,\"stroke\":\"black\",\"strokeWidth\":2,\"strokeDashArray\":null,\"strokeLineCap\":\"round\",\"strokeDashOffset\":0,\"strokeLineJoin\":\"round\",\"strokeMiterLimit\":10,\"scaleX\":1,\"scaleY\":1,\"angle\":0,\"flipX\":false,\"flipY\":false,\"opacity\":1,\"shadow\":null,\"visible\":true,\"clipTo\":null,\"backgroundColor\":\"\",\"fillRule\":\"nonzero\",\"paintFirst\":\"fill\",\"globalCompositeOperation\":\"source-over\",\"transformMatrix\":null,\"skewX\":0,\"skewY\":0,\"path\":[[\"M\",97.998,100],[\"Q\",98,100,98.5,100],[\"Q\",99,100,99,99],[\"Q\",99,98,99,97],[\"Q\",99,96,99,95],[\"Q\",99,94,99,93],[\"Q\",99,92,99,91.5],[\"Q\",99,91,99,90.5],[\"Q\",99,90,98.5,91],[\"Q\",98,92,98,93.5],[\"Q\",98,95,98,97],[\"Q\",98,99,97.5,100.5],[\"Q\",97,102,97,104.5],[\"Q\",97,107,97,108.5],[\"Q\",97,110,96.5,111],[\"Q\",96,112,96,112.5],[\"Q\",96,113,95.5,113],[\"Q\",95,113,95,113.5],[\"L\",95,114.002]]}]}"

这只是一个显示当前状态的对象,像这样,我在数据库中也有许多对象可以存储以前的状态。因为这是实时应用程序,所以我希望尽量减少延迟,所以我需要更快的方法。

我正在使用nodeJs和socket.io。

谢谢

1 个答案:

答案 0 :(得分:0)

使用 Redis

  

Redis是一种开放源代码(BSD许可)的内存中数据结构存储,用作数据库,缓存和消息代理。它支持数据结构,例如字符串,哈希,列表,集合,带范围查询的排序集合,位图,超日志,带有半径查询和流的地理空间索引。 Redis具有内置的复制,Lua脚本,LRU逐出,事务和不同级别的磁盘持久性,并通过Redis Sentinel和Redis Cluster自动分区提供了高可用性。

官方Node.js客户端

它具有多个<?php // Start the session session_start(); ?> <!DOCTYPE html> <html> <body> <?php //after login that user $_SESSION["id"] = $_Post['id']; $_SESSION["id"] = $_Post['username']; ?> 客户端实现。 Here's the officially supported one

注意

虽然Redis比MongoDb快,但这并不是所有问题的解决方案。 You can check out this thread on StackOverflow for a comparison