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

Posted

技术标签:

【中文标题】如何在实时应用程序中存储大量数据【英文标题】:How to store large size data in real time applications 【发布时间】:2019-07-13 17:47:06 【问题描述】:

我正在做一个实时协作画布项目,在这个项目中,用户可以创建房间,其他人可以通过一些 id 和 pass 加入他们。我的应用程序还支持多个选项卡功能,并且我也在使用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】:

使用 Redis

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

Node.js 官方客户端

它有多个Node.js 客户端实现。 Here's the officially supported one

注意

虽然 Redis 比 MongoDb 更快,但它并不能解决所有问题。 You can check out this thread on *** for a comparison

【讨论】:

我可以用它来存储大数据还是有任何数据限制 @faizKhan 它可以存储非常大的数据。您最多可以达到 每个项目 1GB,而这只是一个项目。基本上限制是您的计算机/服务器 我的荣幸!不要忘记投票并接受这个答案@faizKhan。干杯 是的,我会做的

以上是关于如何在实时应用程序中存储大量数据的主要内容,如果未能解决你的问题,请参考以下文章

如何在Ubuntu 18.04上安装Elasticsearch

如何在桌面应用程序中存储“大量”数据?

从浏览器手动将图像存储在 Firebase 存储中。如何使其反映在实时数据库中。这样我就可以在 Android 应用程序中获取

hadoop应用场景

在数据库中存储大量标记的最佳方法是啥?

Java如何获取Redis中存储的大量内容?