【问题标题】:How to reduce Redis connections in a Ruby/Sinatra app? Use connection_pool?如何减少 Ruby/Sinatra 应用程序中的 Redis 连接?使用连接池?
【发布时间】:2014-01-28 09:48:21
【问题描述】:

我有一个可用的 Sinatra 应用程序,它使用 redis-namespace 进行 Redis 连接。它运行良好,但在 Heroku 上,它的 10 个 Redis 连接总是用完,尽管流量很少 - 它们似乎保持打开很长时间,并且应用程序不断打开新连接。

所以,可能有更好的方法来构建我所拥有的东西,这样它就不会不断打开新的连接。或者也许我可以使用connection_pool... 虽然我不确定如何使用 with redis-namespace。

Sinatra 前端 (myapp/frontend.rb) 类似于:

require 'sinatra/base'
require 'myapp/store'

module MyApp
  class Frontend < Sinatra::Base

    registration_store = MyApp::Store::Registration.new
    subscription_store = MyApp::Store::Subscription.new

    get '/' do
      ...
    end

    ...
  end
end

并且访问 Redis 的 Store 类在 myapp/store.rb:

require 'redis'
require 'redis-namespace'

module MyApp
  module Store
    class RedisBase
      attr_accessor :redis

      def initialize
        uri = URI.parse(ENV['REDISCLOUD_URL'])
        redis = ::Redis.new(:host => uri.host, :port => uri.port, :password => uri.password)

        @redis = ::Redis::Namespace.new(:myapp, :redis => redis)
      end

      class Registration < RedisBase
        def add(user_id)
          redis.sadd(:registrations, user_id)
        end
        ...
      end

      class Subscription < RedisBase
        ...
      end
    end
  end
end

前端通过 Store 类存储数据:registration_store.add(37)

我是否做错了什么,不断打开不必要的新连接?或者,如何添加 connection_pool 或类似的?

【问题讨论】:

    标签: ruby heroku redis sinatra


    【解决方案1】:

    我遇到了类似的问题并偶然发现了这个问题。我认为您应该在代码中的某处添加redis.quit。在 redis 命令行上使用 client list 进行一些手动测试监视连接会导致连接在退出时消失。该对象以后仍然可以使用,并且在连接关闭时将打开一个新连接。无需池化! (至少在负载较低时......我猜您最终可能会在较高负载下无法获得连接。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-06-20
      • 1970-01-01
      • 2013-03-18
      • 2019-02-01
      • 1970-01-01
      • 2015-10-18
      • 2015-02-09
      • 1970-01-01
      相关资源
      最近更新 更多