gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 06:07:52 31 4
gpt4 key购买 nike

我有一个使用 redis-namespace 的 Sinatra 应用程序用于其 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 或类似的东西?

最佳答案

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

关于ruby - 如何减少 Ruby/Sinatra 应用程序中的 Redis 连接?使用连接池?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21027077/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com