我正在研究将Heroku用于使用Redis的PHP应用程序。我已经看到了各种Redis插件。例如,使用Redis To Go,可以在PHP代码中使用环境变量$ _ENV ['REDISTOGO_URL']作为Redis Server的URL。

这些附加组件中的大多数都有自己的定价方案,我希望避免这种做法。我对heroku的工作方式有些困惑。有没有一种方法可以直接在没有插件的Dynos上安装Redis?

例如,是否有一个 worker dyno充当服务器,而另一个则充当客户端?如果可能的话,我将如何处理:

  • 在Dyno上安装并运行redis服务器?这就是一样吗
    在其他任何Unix盒上安装?我可以仅使用ssh并安装我想要的任何东西吗?
  • 有一个Dyno连接到
    另一个通过TCP的IP/端口? worker 测功机是否有自己的
    我可以使用可引用的IP地址或命名URL?我可以以某种方式从PHP动态获取它们吗?

  • Redis客户端的php代码假定存在可以连接的主机和端口,但不知道它将是什么?
    $redis = new Predis\Client(array(
            "scheme" => "tcp",
            "host" => $host, //how do i get the host/port of a dyno?
            "port" => $port));
    

    最佳答案

    在dyno上运行redis是一个有趣的想法。您可能需要创建一个redis buildpack,以便您的dynos可以下载并运行redis。作为"redis has no dependencies other than a working GCC compiler and libc",这在技术上应该是可能的。

    但是,您可能会遇到以下一些问题:

  • Heroku dynos没有静态IP地址



    即使您在dyno上设置并运行Redis,我也无法找到一种定位该dyno实例并将其发送给redis请求的方法。这意味着您的Redis服务器可能必须与Web服务器/主应用程序在相同的dyno上运行。

    也是意味着,如果您尝试通过创建更多的Web dynos来扩展应用程序,则还将创建更多的本地redis实例。数据将不会在它们之间共享。这并不是一个特别可扩展的设计,但是如果您的应用足够小,只需要一个Web dyno,它就可以工作。
  • Heroku dynos具有临时文件系统



    默认情况下,Redis将其RDB文件和AOF日志写入磁盘。您需要定期将它们备份到某个位置,以便在dyno重新启动后进行获取和还原。参见documentation on Redis persistence
  • Heroku dynos经常重新启动



    每次dyno启动时,您将需要能够启动您的Redis服务器并恢复数据。
  • Heroku dynos具有512MB RAM



    如果您的Redis服务器与Web服务器在同一台dyno上运行,请减去主应用程序所需的RAM。您需要多少Redis内存?

    以下是一些尝试估计和跟踪Redis内存使用的问题:
  • Redis: Database Size to Memory Ratio?
  • Profiling Redis Memory Usage

  • --

    总体而言:,我建议阅读12 Factor Apps以进一步了解heroku的预期应用程序模型。

    简短的版本是,dynos旨在成为可以轻松创建和丢弃以满足需求的独立 worker ,并且dynos访问各种资源以读取或写入数据并为您的应用程序提供服务。 Redis实例是资源的一个示例。从上面的项目中可以看到,通过使用Redis附加组件,您将获得可以保证是静态,稳定和可访问的内容。

    阅读 Material :
  • http://www.12factor.net/-特别是ProcessesServices
  • The Heroku Process Model
  • Heroku Blog - The Process Model
  • 10-04 11:57
    查看更多