我正在制作聊天程序,我需要一个存储消息的地方。客户端将每隔x秒与服务器联系,并使用最后收到的消息ID,服务器将在客户端已加入的房间中找到ID高于该值的所有消息。
由于我不会永远存储东西,我正在考虑使用平面文件(每个房间一个,以及直接消息),只有最后40个左右的消息。但是,我认为通过比较数字,数据库会更快。
我应该使用哪种数据存储方法?
答案 0 :(得分:9)
平面文件可能会快一点,但从长远来看它最终会变得越来越多,因为你不必只是加载SELECT * FROM messages WHERE room=nnn AND ID > yyy
,而是必须加载文件,解析它,扫描每个文件。消息ID的行,转到右侧消息,然后将其读出。
这只是第一个问题。文本文件不支持多个用户写入(如果两个人同时发布到同一个房间怎么办?),并且很容易被破坏。
考虑到所有事情,我会说使用数据库会更好,即使它像SQLite一样简单,它具有出色的PHP支持。但是,考虑到多用户条件,MySQL可能是一个更好的选择。此外,MySQL具有出色的缓存功能,因此大多数情况下,最近的数据将直接来自RAM,并且比用PHP扫描文本文件的速度更快。
答案 1 :(得分:3)
似乎您根本不需要保留聊天记录,那么为什么要考虑使用永久数据存储(数据库或平面文件)方法?您可以使用内存缓存软件(如Memcashed,比数据库或平面文件更快)来执行此操作。
答案 2 :(得分:1)
通常,数据库会快得多,因为索引会让您直接转到服务器必须发送的记录。
OTOH,只有大约40条消息,它很可能适合RAM,而且记录很少,即使是最简单的线性搜索例程也会比单个高清访问快得多。尽管如此,使用数据库要容易得多,我会将其用于简单而不是速度。此外,如果您有很多同时发送的房间,那么自己编写这些房间意味着有很多机会可以解决不必要的延迟开发的小错误。
只需使用数据库。
答案 3 :(得分:1)
到目前为止,我的方法就是这样。
chat_243.json
并将其保存为已经格式化的json,然后只提供整个文件如果请求进入带有lastMessageReceived = 243
的php。由于这将创建多个文件,因此您需要一个函数来清理超过(m)分钟的文件,但这也是服务器的轻量级工作。还有一些选项,比如为聊天和套接字设计的数据库引擎(node.js),但那些需要比典型的主机帐户允许更多的服务器调整,为了我的目的,我一直在写我的聊天室,记住这个想法,它可能会在某个时候部署到共享服务器。