ruby-on-rails - 使用网络服务时缓存

标签 ruby-on-rails ruby

假设我有一个天气网络服务,每次加载页面时我都会访问(消耗)该服务。效率不高或不智能,可能会超出我的 API 限制或让网络服务所有者发疯。因此,我没有直接从 Controller 操作中获取,而是有一个帮助器/作业/方法(某个层)有机会稍微缓存数据。假设我不太关心数据的实时性。

现在我过去所做的只是将天气服务的属性存储在一个表中,并每隔一段时间刷新数据。例如,天气服务可能如下所示:

Weather for 90210 (example primary key)
-----------------------------
Zip Name: Beverly Hills
Current Temperature: 90
Last Temp: 89
Humidity: 0
... etc.

所以在这种情况下,我会为每个属性创建列,并在我从网络服务获取时存储它们。我可以使用过期的 Rails 操作(页面缓存)来执行刷新,或者我可以执行后台作业。

除非网络服务有大量属性(例如 1000),否则这种简单的方法很有效。现在我花了很多时间创建和维护数据库列,重复别人已经存在的属性。如果我可以简单地缓存整个响应并在需要时将其作为简单的哈希引用,那就太棒了。然后,我将缓存 Web 服务“免费”提供的所有属性,因为 Web 服务的所有功能都将在我的哈希中,而不只是缓存一个子集。

要做到这一点,我也许可以获取 web 服务响应,将其序列化(可能是 YAML),然后获取序列化对象(如果存在)。嗯,不太好。对于特殊字符,序列化可能会变得很奇怪。如果我可以遵循 memcached 类型模型,那真的很酷,但我不认为你可以在 memcached 中存储复杂的对象,对吗?我还想限制引入的软件数量,因此在我看来,独立的代理层并不是最佳选择。

有没有人做过类似的事情或者知道这个名字?

最佳答案

如果您使用的 API 是 RESTful 的并且尊重缓存,请不要重新发明轮子。 HTTP 内置了缓存(参见 RFC 2616),所以尽量使用它。您有两个选择:

  1. 只需在您的应用和 API 之间添加一个 squid 代理即可。
  2. 使用Wrest - 我们编写它是为了支持 HTTP 2616 缓存,它是我所知道的唯一支持 HTTP 2616 缓存的 Ruby HTTP 包装器。

如果 API 不支持缓存(大多数支持),那么您收到的其他建议是有道理的。您实际用来保存缓存的内容(mongodb/memcached/其他)取决于许多其他因素,所以实际上,这取决于您的情况。

关于ruby-on-rails - 使用网络服务时缓存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5393043/

相关文章:

ruby-on-rails - Rails 中授权的功能测试

ruby - 如何判断安装了 RVM 的 ruby​​ 实际使用了哪个 openssl 库

ruby - 如何创建 thor::group 生成器作为 my_command 的参数

ruby-on-rails - PostgreSQL 上的 Active Record 联合分组查询

ruby-on-rails - 无法为 ruby​​-debug-base 找到有效的 gem

ruby-on-rails - 为 Ruby on Rails 设计 gem 安装

ruby-on-rails - 无效的多字节字符 (UTF-8) 错误,Ruby

ruby-on-rails - 预编译 Assets 失败 - 推送到 Heroku

ruby-on-rails - Rails 3.2 什么时候到达生命尽头?

javascript - Rails 5 - 由JS填充的hidden_​​field_tag未通过:onchange提交表单