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

标签 php database memcached chat buffer

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

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

  1. 当消息到达时,我使用当前分钟 (YYYY-MM-DD-HH-MM) 作为键将其保存在 memcached 中。不涉及数据库 I/O。这个想法是同一分钟的所有消息都在同一个 key 下收集。
  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 之前,我已经这样做了。

关于php - 使用 memcached 作为聊天消息的数据库缓冲区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6349617/

相关文章:

mysql - 我应该如何在存储过程中临时存储行?

php - Php 的数据库类(MySQL + MemCached)

php - 将数字分解为数千、数百等

javascript - 如何修改 shopping-cart.tpl 文件以禁用 ajax 样式的购物车站点并添加简单的更新按钮?

java - 想要在HTML onclick(jsp)中调用Javabean方法

mysql - 数据输入跟踪(数据库设计)

mysql - 缓存复杂计算的数据结果

php - 获取错误 324 (net::ERR_EMPTY_RESPONSE)。在 kohana 中使用 memcache 时

php - CentOS php pecl PDO_DBLIB

php - MySQL 在给定时间段内找到前 x%