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