我正在尝试为网站创建聊天,我想知道如果有大量用户,db 解决方案是否是最好的解决方案。
如果数据库是一个可接受的解决方案,我想知道哪种是设计它的最佳方式:
一张表是否足以存储所有用户的所有消息?每次用户发送它时,我是否必须存储每条消息(比如一个记录中的简单“你好”)?
我必须为每个聊天创建单独的表格吗?
显然假设进行了索引和分区。
我很害怕现阶段的表现(分贝级别)。然后我可以更好地专注于中间件部分并在那里进行管理。
我正在尝试为网站创建聊天,我想知道如果有大量用户,db 解决方案是否是最好的解决方案。
如果数据库是一个可接受的解决方案,我想知道哪种是设计它的最佳方式:
一张表是否足以存储所有用户的所有消息?每次用户发送它时,我是否必须存储每条消息(比如一个记录中的简单“你好”)?
我必须为每个聊天创建单独的表格吗?
显然假设进行了索引和分区。
我很害怕现阶段的表现(分贝级别)。然后我可以更好地专注于中间件部分并在那里进行管理。
MySQL 显然不是聊天的最佳解决方案:您没有理由处理多年的积压工作来获取最新消息,也不想为每个活动用户每秒触发一次查询。关系数据库的开销不容忽视。
我会选择redis:它是一种高级键值存储,具有实时交互 (PUB/SUB)、自动过期的功能,在处理简单数据时绝对比 MySQL 快。
编辑:是的,它的所有数据都在内存中。1 Gb 的内存足以容纳世界上每个图书馆中的每一本书。也就是说,MySql 还使用 ram 缓存(查询缓存)。而redis是ACID。(过度简化:您可以启用保存到磁盘。)
如果您还决定使用 MySQL,则必须将每一行都写入 DB 以便其他行可见。更明确地说,您需要对每条消息进行提交。确保你有某种清理机制,例如一个 cronjob 将所有早于一天的消息移动到一些存档表中。
想象一下你房间里有 100 个用户,每个用户每 3 秒检查一次新消息。每秒 300 个查询?(好的,体面的服务器可以处理这个问题,但你要求一个好的解决方案) 换一种方式:有一个 memcached /redis-saved 标志“Last message id”。每次有人在聊天中写东西时更改它。现在让客户端提交它的最后一个已知消息ID。如果你成功了,即使没有启动 MySql 也立即退出。如果你真的很优秀,你可以让 PHP 甚至 make 来返回相应的 ETag。
对于前端客户端:不要每 n 秒触发一次重新加载或 ajax 请求!让自己了解 Websocket 和长投票。这是一种技术,浏览器打开一个不会立即返回结果的站点,但会保持连接打开,直到有要报告的内容(或发生超时)
这取决于你的知识。我会使用 PHP 和 redis,但那是因为我很了解它们。如果您更喜欢 Java,请使用它。如果你没有偏好:Java更通用,php更容易开始学习。没有客观的万能答案。
使用 NOSQL 将数据存储为文件,适用于大型数据库
确定您想要的功能。我能马上想到的一些可能会有所作为: