使用memcached作为聊天消息的数据库缓冲区


Using memcached as a database buffer for chat messages

我正在尝试使用PHP和CodeIgniter构建一个聊天应用程序。

为此,我正在使用memcached实现一个缓存"缓冲区",以在内存中保存最新的聊天消息,从而减少数据库的负载。我想做的是:

  1. 当消息到达时,我使用当前分钟(YYYY-MM-DD-HH-MM)作为密钥将其保存在memcached中。不涉及数据库I/O。其想法是,来自同一分钟的所有消息都收集在同一个密钥下
  2. 用户会收到同样从memcached获取的新聊天消息(目前我使用的是长轮询,但出于明显的性能原因,这将转移到Node.js下的WebSockets)。同样,不涉及数据库I/O
  3. 自动服务器脚本(cronjob)将每5分钟运行一次,收集最后5分钟的memcached数据,并将消息插入数据库
  4. memcached对象设置为在6分钟后过期,因此我们永远不需要在内存中保留超过6分钟的消息数据

这意味着每5分钟总共有一次数据库写入操作,而没有数据库读取操作。

这听起来可行吗?有没有更好的(甚至是内置的)方法可以将memcached用于此目的?


更新:我现在已经做了一些实验,我有了一个快捷方式的想法(阅读:hack)。我可以在Node.js服务器脚本中临时缓冲消息,直到我准备好存储它们。Node.js服务器中的Javascript对象/消息数组基本上是一种内存缓存。

所以:每隔N条消息/秒,我就可以使用我想要的任何方法将缓冲的消息(JS数组的内容)传递到我的数据库,因为它不会经常被调用。

然而,我担心这可能会削弱Node.js服务器进程,因为它可能不喜欢携带200 KB的数组。

对这个策略有什么想法吗?这完全疯了吗?

您研究过HTML5套接字连接吗?使用套接字服务器,您不需要存储任何内容。服务器接收来自一个订阅者的消息,并立即将其发送回正确的订阅者。我自己并没有用HTML5做到这一点,但我知道这个功能现在已经存在了。我在使用同样支持套接字连接的Flash之前已经这样做了。

为什么不使用INSERT DELAYED?它为您提供了几乎与您尝试在不需要memcached的情况下实现的功能相同的功能。

不管怎样,你的解决方案看起来也不错。