我正在考虑将Heroku用于使用Redis的PHP应用程序。我见过redis的各种插件。例如,使用Redis To Go,您可以在PHP代码中使用环境变量$ _ENV ['REDISTOGO_URL']作为Redis服务器的URL。
这些附加产品中的大多数都有自己的定价方案,我想避免。我对heroku如何工作有点困惑。有没有办法可以在没有插件的情况下在我自己的Dynos上安装Redis?
例如,有一个工作器dyno充当服务器,另一个充当客户端吗?如果可能的话,我将如何进行:
在Dyno上安装和运行redis服务器?这和它一样吗? 安装在任何其他unix盒子上?我可以ssh到它并安装我想要的任何东西吗?
让一个Dyno连接到 另一个通过TCP的IP /端口?工人dynos有他们自己的 我可以使用可引用的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));
答案 0 :(得分:10)
在dyno上运行redis是一个有趣的想法。您可能需要创建一个redis buildpack,以便您的dynos可以下载并运行redis。作为"redis has no dependencies other than a working GCC compiler and libc",这在技术上应该是可行的。
但是,您可能遇到以下问题:
Heroku dynos没有静态IP地址
"dynos don’t have static IP addresses .. you can never access a dyno directly by IP"
即使您在dyno上设置并运行Redis,我也不知道找到该dyno实例并发送redis请求的方法。这意味着您的Redis服务器可能必须在与Web服务器/主应用程序相同的dyno上运行。
此也表示如果您尝试通过创建更多网络动态扩展您的应用,您还将创建更多本地redis实例。他们之间不会共享数据。这并不是一个特别可扩展的设计,但如果你的应用程序足够小,只需要一个网络动态,它就可以工作。
Heroku dynos有一个短暂的文件系统
默认情况下,Redis将其RDB文件和AOF日志写入磁盘。你需要定期将它们备份到某个地方,以便在你的dyno重启后可以获取和恢复。请参阅documentation on Redis persistence。
Heroku dynos经常重启
每次dyno启动和恢复数据时,您都需要能够启动redis服务器。
Heroku dynos有512MB RAM
如果您的Redis服务器与您的Web服务器在同一个dyno上运行,请减去主应用程序所需的RAM。你需要多少Redis内存?
以下是尝试估算和跟踪Redis内存使用的一些问题:
-
总体而言:我建议您阅读12 Factor Apps以了解更多有关heroku预期应用模式的信息。
简短版本是dynos旨在成为独立的工作人员,可以轻松创建和丢弃以满足需求,并且dynos访问各种资源来读取或写入数据并为您的应用程序提供服务。 redis实例是资源的示例。正如您从上面的项目中看到的那样,通过使用redis附加组件,您可以获得保证静态,稳定和可访问的内容。
阅读材料:
答案 1 :(得分:-1)
redis有一个客户端服务器架构,您可以将它安装在一台计算机上(在您的情况下是dyno)并从任何客户端访问它。
有关图书馆的更多帮助,请参阅this link 或者你可以通过这个Redis documentaion这是一个使用Redis广告数据库和PHP实现twitter克隆的简单案例研究