所以我的朋友告诉我,Heroku上的实例是持久的(我不确定词汇是否正确,但他暗示所有用户共享相同的实例)。
所以,如果我有app.py
,并且一个实例运行它,那么所有用户都会共享该实例。这意味着我们可以使用dict作为临时缓存来存储小事,以便更快地响应。
例如,如果我正在提供API,我可以定义一个类似this的缓存,然后use it。
这是真的吗?我试着查看,但找不到任何东西。
我在1 dyno上将链接的API部署到heroku,并且每秒只有几个请求,服务它需要100多秒。所以我的理解是缓存不起作用。 (根据新的遗物,这里可能有用的是,大部分时间都归于request queueing。)
答案 0 :(得分:10)
Heroku Devcenter有几篇关于Heroku architecture的文章。
进程不共享内存。此外,您的代码为compiled into a slug并经过优化,可以分发到dyno manager。简单来说,这意味着您甚至不知道哪台机器将执行您的代码。从理论上讲,5个用户点击你的应用程序可能会被路由到5个不同的机器和进程。
最后但同样重要的是,请记住,如果您的应用只运行一个网络动态,那么该网络动态将会睡眠。您必须拥有多个网络动态,以防止网络动态故障。当dyno进入睡眠模式时,内存被释放,你将丢失内存中的所有数据。
这意味着您的方法无效。
一般来说,在Heroku中你应该使用外部存储。例如,您可以使用Memcached add-on并将缓存信息存储在Memcached中。
另请注意,您不应将文件系统用作缓存。不仅因为它比Memcached慢,还因为Cedar堆栈文件系统should be considered ephemeral。