Ruby on rails 适当的Rails低级别并发缓存

Ruby on rails 适当的Rails低级别并发缓存,ruby-on-rails,multithreading,caching,concurrency,Ruby On Rails,Multithreading,Caching,Concurrency,我想在Puma上运行Rails 5应用程序。我使用低级缓存,并假设使用线程安全缓存的方法: # somewhere in a model ... @@mutex = Mutex.new def nice_suff Rails.cache.fetch("a_key") do @@mutex.synchronize do Rails.cache.fetch("a_key", 60) do Model.stuff.to_a end end

我想在Puma上运行Rails 5应用程序。我使用低级缓存,并假设使用线程安全缓存的方法:

# somewhere in a model ...

@@mutex = Mutex.new

def nice_suff
  Rails.cache.fetch("a_key") do
    @@mutex.synchronize do
      Rails.cache.fetch("a_key", 60) do
        Model.stuff.to_a
      end
    end
  end
end

这可以正常工作吗?

处理并发缓存访问的正确方法已经内置

  val_1 = cache.fetch('foo', race_condition_ttl: 10.seconds) do
    Model.stuff.to_a
  end
设置
:race\u condition\u ttl
在缓存项使用非常频繁且负载很重的情况下非常有用。如果缓存过期并且由于负载过重,几个不同的进程将尝试本机读取数据,然后它们都将尝试写入缓存。为了避免这种情况,查找过期缓存项的第一个进程将使缓存过期时间缩短
:race\u condition\u ttl
中设置的值。是的,此过程将过时值的时间再延长几秒钟。由于前一个缓存的使用寿命延长,其他进程将继续使用稍微陈旧的数据一段时间。同时,第一个进程将继续进行,并将新值写入缓存。之后,所有进程都将开始获取新值。关键是保持
:比赛条件\u ttl


您希望通过这种同步实现什么?我认为,只有一个线程将为缓存构建记录。我想我会遇到这样的情况,当几个线程将执行
Model.stuff.to_a
,我无法想象后果))这将在您有两台机器时立即停止工作。对不起,我不确定我对两台机器的理解是否正确。。。但总的来说,我希望第一个阻塞的线程将创建记录,是的,所有其他线程都将等待。当互斥锁打开时,所有等待线程都将从缓存中获取记录。两个独立的服务器运行相同的应用程序代码。你知道,向外扩展。很棒的内置解决方案!谢谢