如何减少Ruby/Sinatra应用程序中的Redis连接?使用连接池?

如何减少Ruby/Sinatra应用程序中的Redis连接?使用连接池?,ruby,heroku,redis,sinatra,Ruby,Heroku,Redis,Sinatra,我有一个正在运行的Sinatra应用程序,用于Redis连接。它工作得很好,但在Heroku上,它的10个Redis连接一直在耗尽,尽管流量很小——这些连接似乎保持了很长一段时间,并且应用程序一直在打开新的连接 所以,也许有更好的方法来构建我所拥有的,这样它就不会不断打开新的连接。或者我可以用。。。虽然我不知道如何在redis命名空间中使用它 Sinatra前端(myapp/frontend.rb)类似于: require 'sinatra/base' require 'myapp/store'

我有一个正在运行的Sinatra应用程序,用于Redis连接。它工作得很好,但在Heroku上,它的10个Redis连接一直在耗尽,尽管流量很小——这些连接似乎保持了很长一段时间,并且应用程序一直在打开新的连接

所以,也许有更好的方法来构建我所拥有的,这样它就不会不断打开新的连接。或者我可以用。。。虽然我不知道如何在redis命名空间中使用它

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
前端通过存储类存储数据:
registration\u Store.add(37)


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

我遇到了一个类似的问题并偶然发现了这个问题。我认为您应该在代码的某个地方添加
redis.quit
。在redis命令行上使用
客户端列表
对连接进行一些手动测试,可以确保连接在退出时消失。该对象以后仍然可以使用,并且在连接关闭时将打开一个新连接。不需要共享!(至少在负载较低的情况下……我猜在负载较高的情况下,您可能会接到无法连接的电话。)

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