gpt4 book ai didi

ruby-on-rails - 如何创建第二个 Rails 内存存储缓存?

转载 作者:行者123 更新时间:2023-12-04 02:14:30 24 4
gpt4 key购买 nike

我正在使用 Rails 5。我正在使用 Rails 内存缓存来缓存数据库查询结果,例如,这是在我的 state.rb 中。模型 ...

  def self.cached_find_by_iso_and_country_id(iso, country_id)
if iso
Rails.cache.fetch("#{iso.strip.upcase} #{country_id}") do
find_by_iso_and_country_id(iso.strip.upcase, country_id)
end
end
end

我的问题是,如何创建第二个内存中 Rails 缓存(我需要一个用于存储从 Internet 下载的文件),它不会干扰我上面的查询缓存?我不希望我的文件缓存中的条目导致我的查询缓存中的条目被驱逐。

最佳答案

是的,你可以用 Rails 做到这一点。您需要创建第二个缓存并将其作为全局变量在您的应用程序中可用,然后根据上下文调用适当的缓存。每个缓存都分配有自己的内存块(默认为 32 MB),如果一个缓存已满,则不会影响另一个缓存。这是通过 ActiveSupport::Cache::MemoryStore.new 完成的。 .

我将证明这两个缓存不会相互影响:

首先,生成两个用于测试缓存的文本文件,一个 10 MB 和一个 30 MB:

dd if=/dev/zero of=10M bs=1m count=10
dd if=/dev/zero of=30M bs=1m count=30

打开 Rails 控制台并将这些读入字符串:
ten    = File.read("10M"); 0
thirty = File.read("30M"); 0

店铺 ten在缓存中:
Rails.cache.fetch("ten") { ten }; 0

确认数据已缓存:
Rails.cache.fetch("ten")[0..10]
=> "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"

店铺 thirty在缓存中:
Rails.cache.fetch("thirty") { thirty }; 0

确认没有保存(展开为字符串时太大而无法保存在缓存中):
Rails.cache.fetch("thirty")[0..10]
NoMethodError: undefined method `[]' for nil:NilClass

确认这已经破坏了整个缓存:
Rails.cache.fetch("ten")[0..10]
NoMethodError: undefined method `[]' for nil:NilClass

现在创建第二个缓存并确认它的行为与原始缓存相同:
store = ActiveSupport::Cache::MemoryStore.new
store.fetch("ten") { ten }; 0
store.fetch("ten")[0..10]
=> "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"
store.fetch("thirty") { thirty }; 0
store.fetch("thirty")[0..10]
NoMethodError: undefined method `[]' for nil:NilClass
store.fetch("ten")[0..10]
NoMethodError: undefined method `[]' for nil:NilClass

现在有两个空缓存: storeRails.cache .让我们确认它们是独立的:
Rails.cache.fetch("ten") { ten }; 0
Rails.cache.fetch("ten")[0..10]
=> "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"
store.fetch("thirty") { thirty }; 0 # bust the `store' cache
Rails.cache.fetch("ten")[0..10]
=> "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"

如果两个缓存相互干扰,那么最后一个 store.fetch call 会破坏两个缓存。它只会破产 store .

要在您的应用程序中实现第二个缓存,请创建一个初始化程序 config/initializers/cache.rb并添加:
$cache = ActiveSupport::Cache::MemoryStore.new

在代码中调用新缓存的方式与 Rails.cache 相同。 :
$cache.fetch("foo") { "bar" }

其中一些细节取自 this answer .新的缓存支持附加选项;查看 MemoryStoreCaching with Rails有关自定义缓存的更多信息。

此解决方案适用于小型应用程序。请注意来自 MemoryStore 的评论文档:

If you're running multiple Ruby on Rails server processes (which is the case if you're using mongrel_cluster or Phusion Passenger), then this means that Rails server process instances won't be able to share cache data with each other and this may not be the most appropriate cache in that scenario.

关于ruby-on-rails - 如何创建第二个 Rails 内存存储缓存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43375377/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com