【问题标题】:How do I implement connection pooling for Redis-As-Rails-Cache (using Redis as rails cache) Rails 4.1?如何为 Redis-As-Rails-Cache(使用 Redis 作为 Rails 缓存)Rails 4.1 实现连接池?
【发布时间】:2017-07-06 08:36:54
【问题描述】:

如何将连接池添加到我的 Redis 设置中?

由于某种原因,我似乎无法找到任何有关此的信息。我正在使用 redis (3.2.0) 设置如下: (你可以假设 resque_uri 和 cache_uri 在这个 c 之前已经被解析)

对于resque:

$REDIS_BACKGROUND_JOB =  Redis.new(:host => resque_uri.host, 
                                  :port => resque_uri.port, 
                                  :password => resque_uri.password)

在初始化序列的后面,我们这样做

Resque.redis = $REDIS_BACKGROUND_JOB

我们有第二个 Redis 实例,它具有不同的内存、连接限制和驱逐策略,用于 Rails 缓存

$REDIS_CACHE = Redis.new(:host => cache_uri.host, 
                        :port => cache_uri.port, 
                        :password => cache_uri.password)

更新 2017-02-16@20-17EST:我正在运行两个 redis 实例,一个用于 resque (1.25.2),另一个用于使用 redis-rails (5.0.1) 的缓存层。我已经更新了上面的设置示例。我怀疑初始化中配置错误或存在基本设置不匹配。

更新 2017-02-16@21-37EST:

environments/development.rb

config.cache_store = :redis_store, 'redis://localhost:6379/1/cache_store'

【问题讨论】:

  • 虽然我找到了一些示例来展示如何使用 ConnectionPool.new,但我不确定如何使用以下语法将其连接到 config/application.rb 中配置的 Rails 缓存: config.cache_store = :redis_store, "redis://localhost:6379/0/cache"
  • 我还想在此处补充一点,我无法让连接池在 Resque 上工作;它在 Resque 代码中出错。 (但是当我试图实例化一个基本的 Redis.new 对象时,我已经能够获得一个基本的 ConnectionPool 与gem 'connection_pool' 一起使用。但是,正如您将在config/application.rb 中注意到的那样,Rails 的缓存存储是由config.cache_store 和我配置的我不确定如何添加连接池)
  • @Sooraj -- 是的,我看过那个文档,但是 Rails 缓存如何知道打开该池连接而不是打开它自己的连接?这篇 SO 帖子是指将 Redis 用于 Sidekiq,这不是我的障碍。我不明白如何为 Rails 缓存汇集连接(我什至需要吗?)。我确实理解这篇 SO 帖子显示了如何轮询 Sideqik 的连接
  • @Sooraj -- 我承认我的问题将两种设置混为一谈——一种用于 Resque,另一种用于 Rails 缓存。我相信两者的混为一谈是我的问题,但我还没有弄清楚。您提供的链接是让连接池在 Sideqik 上工作的示例,因此我想取消它作为此问题的答案的资格,因为它没有回答问题的根源:如何配置 Rails 缓存以使用池化的redis实例?

标签: ruby ruby-on-rails-4 redis resque redis-rails


【解决方案1】:

好的,这就是我的工作。

添加到我的 Gemfile

gem 'connection_pool'

对于 RAILS 缓存:

为 Rails 缓存初始化 $REDIS_CACHE = Redis.new 不正确,因为 Rails 在环境文件中的 config.cache_store 设置中执行此操作(config/environments/development.rbconfig/environments/production.rb 等)

然后我在我的环境文件中初始化如下:

config.cache_store = :redis_store, ENV["REDISCLOUD_FOR_RAILS_CACHE_URL"], {pool_size: 10, pool_timeout: 10}

(您会注意到,ENV["REDISCLOUD_FOR_RAILS_CACHE_URL"] 被设置为完整的 URI,包括协议、用户名、密码、主机和端口。另一种方法是在散列中将它们作为自己的参数传递。)

【讨论】:

    猜你喜欢
    • 2017-06-28
    • 2018-10-05
    • 1970-01-01
    • 2012-08-17
    • 2015-10-26
    • 2016-08-28
    • 1970-01-01
    • 2021-09-01
    • 1970-01-01
    相关资源
    最近更新 更多