我一直在开发一个用于计算机的web应用程序,并试图在redis上存储一些有关活动计算机的信息。我在Heroku上托管我的Flask网络应用程序,并使用Heroku redis。
当我在本地机器上使用Heroku Redis URL进行测试时,没有任何问题,一切似乎都很好。
我遇到的问题是当我在heroku上推送和主持时。一旦与redis数据库发生任何交互,工作人员就会发出H12 web请求超时,我的任何页面都不会加载。
at=error code=H12 desc="Request timeout" method=GET path="/" host=my_app ... dyno=web.1 connect=0ms service=30000ms status=503 bytes=0 protocol=https
起初,我认为连接到redis数据库有问题,但在启动时,我可以在日志中看到它的连接没有问题。我还认为这可能是因为我正在初始化一些列表和哈希,但在删除这些列表和哈希后;设置";发射时也引发了同样的问题。奇怪的是,如果我删除了任何get、set等,但保留了与redis数据库的连接,那么一切都会正常运行。然而,只要我尝试一个简单的get或set,就会出现前面提到的错误。我已经在下面提供了初始化redis实例的代码,并注意到我使用的是如下所示的蓝图模型。(我也尝试过将redis实例的初始化移到init文件中,但它仍然会给出相同的结果(。
- app
- application
- __init__
- models
型号.py
import os
from urllib.parse import urlparse
import redis
url = urlparse(os.environ.get("REDIS_URL"))
my_redis = redis.Redis(host=url.hostname, port=url.port, username=url.username,
password=url.password, ssl=True, ssl_cert_reqs=None)
问题是您需要将REDIS_URL更改为REDIS_TLS_URL或将ssl设置为False。不过,出于安全考虑,最好设置REDIS_TLS_URL。
如果您需要同时处理Heroku-env和本地env,请设置一个持久的Heroku-nv变量,如
heroku config:set HEROKU=1
然后在你的应用程序上添加
if 'HEROKU' in os.environ:
url = urlparse(os.environ.get("REDIS_TLS_URL"))
else:
url = urlparse(os.environ.get("REDIS_URL"))