【问题标题】:keep database in memory, even if client script is disconnected将数据库保留在内存中,即使客户端脚本已断开连接
【发布时间】:2014-01-22 12:01:07
【问题描述】:

我需要在将一些统计数据写入主数据库之前对其进行预处理。我的 php-cli 脚本每 10 分钟检索一次数据,并将其存储在某个地方。每小时对所有保存的数据进行一次预处理,然后写入主数据库。

我认为如果我将它保存在内存中,sqlite 应该是一个不错的解决方案。我没有大量的数据(我可以将其保存在我的 RAM 中)。

实际上,我是 sqlite 的新手(以前我只使用 mySQL)。 我发现here 可以使用:memory: 而不是文件名来仅使用内存。但是在客户端断开连接后,数据库被破坏,如果我尝试从我的脚本再次连接到:memory: - 它将是不同的(新的,空的)数据库。

对吗?如果是,如果 sqlite 存储在内存中,我如何使用不同的 php 脚本调用来处理相同的数据库?

附:也许将sqlite文件放到某个“魔术”目录中是一种解决方案? (我用的是linux)

【问题讨论】:

  • 很可能像 MariaDB (MySQL)、PostgresQL、MongoDB 之类的 DBMS 将在实践中自己在内存中保留一个小型数据库。

标签: php linux sqlite memory


【解决方案1】:

首先,Linux 在使用文件系统缓存方面非常聪明。因此,从磁盘读取数据的速度通常非常快,您应该衡量一下性能提升是否值得。

如果您想继续,您可能会考虑使用 ramdisk 的一种方法。 Linux 提供了一种在内存中创建文件系统的方法,您可以将 sqlite 文件放入其中。

# mkdir -i /mnt/ram
# mount -t ramfs -o size=20m ramfs /mnt/ram
# touch mydb.sql
# chown apache:apache mydb.sql

...或类似的东西。

【讨论】:

    【解决方案2】:

    :memory: 创建的 SQLite 数据库在您断开与数据库句柄或退出/终止使用它的进程的连接时会自动销毁。

    如果您想让多个 PHP 会话访问数据库,您不能使用:memory:。如果您没有大量数据,您应该将中间结果存储在一些持久数据库中的辅助表中 - MySQL 或 SQLite,使用磁盘上的真实文件。

    【讨论】:

      猜你喜欢
      • 2015-06-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-01
      相关资源
      最近更新 更多