我有一个使用Memcachier(达利作为客户端)部署到Heroku的Rails应用程序。我正在使用免费的加载项(提供25 MB的缓存)。

我们开始从heroku接收请求超时,并且在调试之后,我们发现手动刷新Memcachier可以解决该问题。

当Memcachier达到接近其限制的水平(例如20 MB(限制为25 MB))时,就会发生超时。

为什么Memcachier不随时间释放缓存空间?是否有任何缺少的配置告诉Memcachier当缓存达到一定大小时刷新?

我的conf:

application.rb

config.cache_store = :dalli_store

production.rb
client = Dalli::Client.new
config.action_dispatch.rack_cache = {
    :metastore    => client,
    :entitystore  => client,
    :allow_reload => false
}

最佳答案

也许尝试更新您的production.rb以包括socket_timeoutsocket_failure_delay选项。

require 'dalli'
cache = Dalli::Client.new((ENV["MEMCACHIER_SERVERS"] || "").split(","),
                    {:username => ENV["MEMCACHIER_USERNAME"],
                     :password => ENV["MEMCACHIER_PASSWORD"],
                     :failover => true,
                     :socket_timeout => 1.5,
                     :socket_failure_delay => 0.2
                    })

- 或者 -

如果您使用的是 Puma ,则需要安装connection_pool gem。

gem 文件
gem 'connection_pool'

而这个配置在您的production.rb中
config.cache_store = :dalli_store,
                    (ENV["MEMCACHIER_SERVERS"] || "").split(","),
                    {:username => ENV["MEMCACHIER_USERNAME"],
                     :password => ENV["MEMCACHIER_PASSWORD"],
                     :failover => true,
                     :socket_timeout => 1.5,
                     :socket_failure_delay => 0.2,
                     :pool_size => 5
                    }

10-07 15:13