【问题标题】:Best way to have a persistent in-memory hash in rails?在 Rails 中拥有持久内存哈希的最佳方法?
【发布时间】:2016-01-28 13:55:48
【问题描述】:

假设我有一个包含 100000 个城市(id、city)的表,并且我的应用程序的布局方式是我需要 id->city 映射来进行许多搜索。禁止为每个此类翻译运行 SQL 记录。假设搜索结果页面显示 1000 条记录,我不想在现有查询之上添加 1000 条 SQL 查询。

我已经阅读了有关急切加载原语 (:includes) 的信息,但这并不完全符合我的需要。我想让这张 100000 个城市的表格常驻在内存中。目前我正在尝试避免使用 redis 之类的东西来使自己摆脱一种依赖。

是否有一个共享内存区域,当 rails/passenger 启动时我可以在这个哈希表中推入,然后所有传入的请求都可以从那里查找这个持久哈希。

我相信,如果我在我的 application_controller 中创建这样的哈希,每次收到请求时都会初始化这个哈希,这会使事情变得比我现在拥有的更糟(或者不会?)

实例化所有请求都可以共享的共享持久内存的 Rails 方式是什么?

【问题讨论】:

  • 任何有足够存储空间的缓存服务器。如果不是 Redis,还有 memcached。无论如何,您都需要某种缓存。
  • Rails 不是缓存这些信息的地方。使用专为其设计的单独服务器来执行此操作。避免依赖,当这些东西被设计成你需要的时候,不是很好地利用你的时间或资源。明智地选择和选择,而不是仅仅因为某件事“不是在这里发明的”而任意回避,而这正是你正在做的。
  • 铁皮人——我不同意这种说法。我认为您需要考虑添加外部依赖项(以及必要的操作开销)是否可以很好地利用您的时间。如果相对于他的可用内存而言,这是一个微不足道的数据集,那么使用 in memory store 将满足他的需求。
  • Rails 已经依赖服务器,即数据库来处理数据缓存。问题是,我们不知道他的数据对象是什么,也不知道他的服务器能力,或者他的数据库设计是否正确(返回 1,000 条记录不应该需要 1,000 次查询)。事实上,这个问题非常模糊且定义不明确,如果没有这些信息,很难给出任何可用的答案,接受这是可能的,但我们不知道这是否是个好主意。
  • @theTinMan 这个问题的定义并不明确——我也没有尝试使用某些东西,因为它“不是在这里发明的”。这个问题是一个 10,000 英尺的设计问题,“如果我们可以在内存中的某个位置放置一个相对较小的散列,是否有办法避免 redis/外部缓存”。它是一个导轨设计问题。我知道这些缓存和权衡等。我想避免的是实现 redis,然后遇到这个漂亮的 rails 功能做同样的事情。似乎还没有任何这样漂亮的功能,所以看起来像是外部缓存。感谢您的 cmets。

标签: mysql ruby-on-rails ruby hash in-memory-database


【解决方案1】:

听起来您需要缓存,您只是想避免使用外部服务器。我使用 Rails 的内置内存存储缓存解决方案进行全局有效的大型计算,但我不想往返于外部缓存。

在您的环境中使用和调整此设置。 config.cache_store = :memory_store, { size: 64.megabytes }

当然,Rails Caching Guide 包含所有详细信息。

【讨论】:

  • 2.5 ActiveSupport::Cache::MemCacheStore 该缓存存储使用Danga 的memcached 服务器为您的应用程序提供集中式缓存。 Rails 默认使用捆绑的 dalli gem。这是目前最流行的生产网站缓存存储。这很棒,我想我可以在内置内存存储中使用 rails 做我想做的事。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-23
  • 2018-05-16
  • 1970-01-01
  • 2010-09-28
  • 2012-02-09
  • 2010-11-03
相关资源
最近更新 更多