我正在尝试使用 PHP 和 CodeIgniter 构建一个聊天应用程序。
为此,我正在使用 memcached 实现缓存“缓冲区”,以将最新的聊天消息保存在内存中,从而减少数据库的负载。我想做的是:
- 当消息到达时,我使用当前分钟 (YYYY-MM-DD-HH-MM) 作为键将其保存在 memcached 中。不涉及数据库 I/O。这个想法是同一分钟的所有消息都在同一个 key 下收集。
- 用户会收到同样从 memcached 获取的新聊天消息(目前我使用的是长轮询,但出于明显的性能原因,这将转移到 Node.js 下的 WebSockets)。同样,不涉及数据库 I/O。
- 自动服务器脚本 (cronjob) 将每 5 分钟运行一次,收集最近 5 分钟的 memcached 数据并将消息插入数据库。
- memcached 对象设置为在 6 分钟后失效,因此我们永远不需要在内存中保留超过 6 分钟的消息数据
每 5 分钟总共有一个数据库写入操作和零个数据库读取操作。
这听起来可行吗?有没有更好的(甚至可能是内置的?)方式来使用 memcached 来达到这个目的?
更新:我现在已经进行了一些试验,并且我有一个快捷方式的想法(阅读:hack)。我可以在 Node.js 服务器脚本中临时“缓冲”消息,直到我准备好存储它们。 Node.js 服务器中的 Javascript 对象/消息数组基本上是一种内存缓存。
因此:每 N 条消息/秒,我可以使用我想要的任何方法将缓冲的消息(JS 数组的内容)传递到我的数据库,因为它不会被经常调用。
但是,我担心这可能会削弱 Node.js 服务器进程,因为它可能不喜欢携带 200 KB 的数组。
对这个策略有什么想法吗?完全疯了吗?
最佳答案
您是否研究过 HTML5 套接字连接?使用套接字服务器,您不需要存储任何内容。服务器收到来自一个订阅者的消息,并立即将其发送回正确的订阅者。我自己还没有使用 HTML5 完成此操作,但我知道该功能现在已经存在。在使用也支持套接字连接的 Flash 之前,我已经这样做了。
关于php - 使用 memcached 作为聊天消息的数据库缓冲区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6349617/