【问题标题】:PHP ,MySQL memory DB and memcachedPHP、MySQL 内存数据库和 memcached
【发布时间】:2009-08-29 05:30:01
【问题描述】:

我有一个在没有 memcached 的共享主机中运行的站点。 那么,如何将 MySQL 内存 DB 像 memcached 一样作为对象缓存?

【问题讨论】:

    标签: php mysql memcached


    【解决方案1】:

    我会说,如果您运营的网站需要 memcached,那么您不应该在共享主机上运行它。

    这是我轻率的回答。这是一个真正的答案:

    Memcached 比 MEMORY 存储引擎有一些很好的优势。

    • 存储分布在多个服务器上。 MEMORY 存储引擎仅限于单个主机,并受该主机的 CPU 和内存限制。
    • 快速访问各个条目。 MEMORY 存储引擎只有表级锁定,因此并发性会受到影响。
    • 非关系键/值存储。 MEMORY 存储引擎更加结构化,这对于缓存类型的使用没有那么有用。此外,MEMORY 将 varchar 扩展为全长,因此存储效率较低。

    作为缓存解决方案,我不会选择 MySQL MEMORY 存储引擎。由于您使用的是 PHP,因此您应该使用 APC 或 Xcache 或其他东西。它们具有数据缓存功能,更适合 PHP 中的典型用法。

    如果您没有使用其中一种 PHP 缓存技术,那么与担心 memcached 与 MEMORY 存储引擎相比,这是一个更重要的改进领域。

    【讨论】:

      【解决方案2】:

      我同意 Bill 的观点,这样使用 MySQL 不会获得同样的性能提升。

      假设:

      确保您的主机启用了内存存储引擎。

      SHOW ENGINES;
      

      这将显示您的 mysql 实例中安装的所有存储引擎的列表和状态。

      Memcache 允许您存储任意长度的数据。在内部,它会检查您的数据以查看它的长度,并将其放置在与您存储的项目大小最接近的预分配内存桶中。这部分逻辑,你需要自己实现。 MySQL 的内存存储引擎只接受固定长度的行。要在 mysql 中获得类似的效果,您需要在内存中创建多个具有不同长度的 char 字段的表来存储数据。 http://dev.mysql.com/doc/refman/5.0/en/memory-storage-engine.html

      无论键实际存储在哪个表中,选择所有“桶”之间具有联合的表都会产生正确的值。

      mysql 的一个陷阱,如果您将数据存储在比该字段长的字段中(例如 16 个字符字段中的 18 个字符),mysql 将截断它而不会出现任何错误。

      这是一个更好的主意:将 Zend_Cache 与“文件”后端一起使用。 这将像 memcache 一样将内容存储在网络服务器本地磁盘上。 连接到共享主机中的数据库通常很昂贵。 (我的 Godaddy 帐户的第一次连接需要 1 到 2 秒。)即使是慢速磁盘也比这更快。 http://framework.zend.com/manual/en/zend.cache.html

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-04
        • 2011-01-13
        • 1970-01-01
        相关资源
        最近更新 更多