信使应用程序中的Json性能



我有一个基于web的即时通讯应用程序编写的PHP。最近我从mysql迁移到couchdb,我认为这是一个好主意,到目前为止它工作得很好。我不需要风景等等。我通过ID获取文档。

但是我对性能有些怀疑。两个用户之间的对话存储在单个文档中。例如,在A和B之间,我有一个文档,在C和B之间,我有另一个文档,等等。

我从不删除日志,当一个新的对话在这两个用户之间发起时,我解码存储文档与json_decode,打印两个用户最近的对话历史。当其中一个编写新的内容时,我在数组的末尾添加新的聊天行(我从文档中获得的),将数组重新编码为json,最后更新文档。

我说的对吗?在no-sql数据库中存储如此大的数组的最佳实践是什么?

我会用不同的方式建模;每说一件事都要用文档记录。{"从":"foo"、"到":"酒吧","文本":"嘿"}。因此,您只需要创建新文档,并且每个文档都非常小。

添加一个时间戳,然后使用一个与该时间戳相关的视图来重建会话。

你会想使用服务器的时间,以确保正确的顺序,所以我建议你通过一个更新处理程序(http://wiki.apache.org/couchdb/Document_Update_Handlers)更新,并在那里添加时间戳

一种解决方法是偶尔将旧消息捆绑到CouchDB附件中。当您按文档ID查询时,这些将不可见。

例如,对话文档:

{ "_id": "alice_bob"
, "_rev": "123-abcdef"
, "messages":
  [ "alice: Hi, Bob!"
  , "alice: Are you there?"
  , "bob: Yes, what's up?"
  , // ... etc.
  , "bob: Thanks!"
  ]
}

例如,如果会话长度大于200条消息,则将其拆分为两个数组:

  • 150条最老的消息("alice: Hi, Bob", and the next 149)
  • )
  • 最新消息50条:(49条消息,不含"bob: Thanks!")

在附件中存档旧消息,可能带有时间戳。

{ "_id": "alice_bob"
, "_rev": "123-abcdef"
, "_attachments":
  { "2011-09-19T17:29:17.293Z.json":
    { "content_type": "application/json"
    , "data": /* 150 message JSON string goes here */
    }
  }
, "messages": [ /* latest 50 messages go here */ ]
}

当您获取/db/alice_bob时,您将而不是获取附件数据;但是你可以直接从这个URL获取甚至删除附件。

/db/alice_bob/2011-09-19T17:29:17.293Z.json

注意,这主要是一种变通方法。这样做的好处是您根本不需要更改PHP代码。(消息归档可以是一个后台过程。)但从长远来看,Robert的技术更具可扩展性和正确性。

最新更新