【问题标题】:Any idea in implementing ring buffer using MySQL使用 MySQL 实现环形缓冲区的任何想法
【发布时间】:2012-03-04 03:12:17
【问题描述】:

首先,我打算使用内存来存储每个用户最近的“用户更新”记录。
我是 MySQL 新手。如何在内存中创建表?
官网上说建表时可以设置ENGINE = MEMORY。但该文档声称内存中的这些表始终是用于读取的,而不是用于写入的。

我根本不知道该怎么做。

这几天我都陷入了这个问题。我无法在服务器中安装 memcache 和任何 PHP 扩展,因为我没有使用虚拟专用服务器,我能做的只是在 httpdocs 文件夹中传输脚本和文件......我也尝试过使用平面文件来存储数据以工作作为缓冲区/缓存,但我发现由于权限被拒绝,我无法在服务器的文件目录中写入/创建文件,并且我不允许更改此权限。
使用 MySQL 来缓冲可能是我唯一的选择。希望有人能给我一些提示。

谢谢。

附言我正在使用运行 PHP 的 Linux Apache 服务器,使用 MySQL 作为 DB。

【问题讨论】:

  • 你能更好地描述你想要做什么吗?
  • 实际上我正在为我的 iPhone 应用程序编写服务器端脚本,这个应用程序会定期向 Web 服务器发送数据。这些数据将存储在 MySQL DB 中,但我还想要最新的,假设每个用户的 30 条数据保存在内存中,以便浏览器端以更高的速度访问用户的最新数据。
  • 如果您有足够多的用户需要此功能,您将没有足够的内存来按您建议的方式扩展此功能。创建一个适当的索引并在普通表上执行此操作。

标签: php mysql memory buffer


【解决方案1】:

ENGINE = MEMORY 表可用于读取或写入。

唯一需要注意的是,当服务器崩溃、关闭、重新启动等时,内存表中的所有数据都会消失。(正如您对内存表所期望的那样。)

【讨论】:

  • 你的意思是重启服务器/服务器崩溃会清空内存表,但不会删除它们?
  • @user988988 表模式不会与表本身一起存储 - 因此表定义将被保留(因为它不只是存储在内存中)。
【解决方案2】:

你真的应该仔细阅读 MySQL 的 MEMORY 引擎。数据存储在 RAM 中,因此当服务器关闭或重新启动时,RAM 将被清除,数据将被擦除。 MEMORY表应该是MySQL中访问速度最快的表类型,但只存储临时数据,不保证。

如果我理解正确,您是在尝试对 PHP 生成的某种数据进行静态缓存,不是吗?最简单的方法是将它们作为实体文件缓存写入 www 目录,无论是 HTML 还是 JS。如果您不能将您的目录 chmod 为可写,那么将它们存储在 MySQL 中也应该没问题,但前提是这确实有帮助。

缓存数据的思想是:减少SQL查询,减少磁盘I/O,减少代码生成。但是使用 MEMORY 表会消耗过多的内存。将它们存储在普通的 MyISAM 表中也应该没问题,并且可以保护您的大量后台工作。

但是,应该有两点需要考虑:1、访问时是否缓存不存在; 2,如果缓存是最新的。

为您的结果提供某种键应该是一个好主意,因此 PHP 首先检查缓存的日期,如果不存在,则生成缓存,然后显示,否则直接显示缓存。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多