我目前正在开发一个简单的PHP应用程序,用户可以相互发送消息。消息存储在SQL数据库中。我想在每个页面的菜单中放置一些未读消息,以便用户可以快速查看是否有新消息而无需定期检查收件箱。
虽然这可能是一个容易解决的问题,但我不知道最佳方法是什么,性能方面:
我的所有解决方案都基于服务器,因为我对JS不是很熟悉。但如果使用JavaScript存在更好的解决方案,那没关系。
感谢您的帮助!
答案 0 :(得分:2)
我建议4日:
向用户发送新邮件后,您需要更新memcache
中的计数器。您可以在客户端创建简单的ajax应用程序,每隔X秒发送一次请求。在服务器端,您只需检查是否有未读消息。在页面刷新时,您不需要查询数据库,因为您可以非常快地从memcache
计算。
如果我在DB中遇到瓶颈,那就是我所做的(在90%的情况下,DB是任何数据库驱动的应用程序的周末部分)。
这就是我们通常在高负载网站上所做的事情:我们试图避免任何COUNTER查询。如果没有,我们将数据库非规范化以将计数器存储在适当的表中,作为另一列,例如如果您无法使用memcache
,则会将未读消息计数器存储为Users
表的列。
答案 1 :(得分:1)
除了我将memcached添加为解决方案4之外,我会选择第三选项。
答案 2 :(得分:1)
执行未读的纯SQL COUNT() 每页加载的消息(即时 已通知变更,但可能会产生影响 表现很糟糕?)
只要你有一个像样的表结构,COUNT()是一个非常快的命令。我不会缓存这个特定的命令。我会改编其他查询,以确保在向他们展示商家信息时只返回所需的数据。例如,如果你需要的只是摘录,我肯定会做这样的事情:
SELECT id, author, msgdate, substring(body, 0, 50) from table where recipient = ?
而不是
SELECT * from table where recipient = ?;
答案 3 :(得分:0)
IMHO。最好让客户端ping服务器并发送一个带有未读消息量的json。在mysql中计数应该很快,所以我认为没有理由不使用它。只需在聊天会话中过滤结果即可。
对于数据库部分。最好的方法是存储填充在db表中的new_message并将其默认为1,并在加载消息时将其设置为0。