【发布时间】:2011-09-15 00:44:15
【问题描述】:
我正在使用 PHP 和 CodeIgniter 构建一个聊天应用程序。
为此,我正在使用 memcached 实现一个缓存“缓冲区”,以在内存中保存最新的聊天消息,从而减少数据库的负载。我想做的是这样的:
- 当消息到达时,我使用当前分钟 (YYYY-MM-DD-HH-MM) 作为键将其保存在 memcached 中。不涉及数据库 I/O。其理念是同一分钟的所有消息都收集在同一个密钥下。
- 用户收到的新聊天消息也从 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 数组。
对这个策略有什么想法吗?是不是完全疯了?
【问题讨论】:
-
要研究的技术:COMET 和 erlang/jabber(Facebook 使用这些)或:HTML5 和 Web 套接字(带有 Flash 套接字后备 - Google 用于这些)
标签: php database memcached chat buffer