【问题标题】:Cannot name a Redis client in Rails 6 app无法在 Rails 6 应用程序中命名 Redis 客户端
【发布时间】:2023-03-05 05:24:01
【问题描述】:

我目前正在尝试通过允许 Redis 客户端池到我的 Rails 6 应用程序来改进我的 Redis 配置,按照这个线程 What is the best way to use Redis in a Multi-threaded Rails environment? (Puma / Sidekiq)

虽然在实施上述操作之前,我试图命名我的 Rails 应用程序正在共享的唯一 Redis 客户端,但无法使其正常工作。

redis.yml

development:
  url: redis://localhost:6379/
  db: 0
  id: my_rails_redis

production:
  url: 
  db: 0

test: 
  url: redis://localhost:6379/
  db: 1  

redis.rb

conf = Rails.application.config_for(:redis)
redis = Redis.new(conf)

一切正常。我对Redis.current 的调用在redis-cli 中正常工作,当我输入client list 时,我得到以下列表:

id=57 addr=127.0.0.1:60754 fd=19 name= age=1099 idle=422 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=0 events=r cmd=hget
id=58 addr=127.0.0.1:60756 fd=20 name=ActionCable-PID-18018 age=1099 idle=422 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=0 events=r cmd=publish
id=47 addr=127.0.0.1:60702 fd=8 name= age=1110 idle=1 flags=b db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=0 events=r cmd=brpop
id=48 addr=127.0.0.1:60704 fd=9 name= age=1110 idle=1 flags=b db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=0 events=r cmd=brpop
id=65 addr=127.0.0.1:32896 fd=17 name=ActionCable-PID-19465 age=460 idle=422 flags=N db=0 sub=3 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=0 events=r cmd=subscribe
id=49 addr=127.0.0.1:60706 fd=10 name= age=1110 idle=1 flags=b db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=0 events=r cmd=brpop
id=50 addr=127.0.0.1:60708 fd=11 name= age=1110 idle=5 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=0 events=r cmd=scard
id=63 addr=127.0.0.1:32784 fd=15 name= age=472 idle=0 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=32768 obl=0 oll=0 omem=0 events=r cmd=client
id=66 addr=127.0.0.1:32994 fd=18 name= age=424 idle=424 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=0 events=r cmd=hget
id=67 addr=127.0.0.1:32996 fd=21 name=Sidekiq-server-PID-19455 age=424 idle=424 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=0 events=r cmd=exec
id=64 addr=127.0.0.1:32790 fd=16 name= age=460 idle=447 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=0 events=r cmd=hvals
id=62 addr=127.0.0.1:32782 fd=14 name=ActionCable-PID-19477 age=474 idle=460 flags=N db=0 sub=1 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=0 events=r cmd=unsubscribe
id=51 addr=127.0.0.1:60710 fd=12 name= age=1110 idle=1 flags=b db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=0 events=r cmd=brpop
id=52 addr=127.0.0.1:60712 fd=13 name= age=1110 idle=1 flags=b db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=0 events=r cmd=brpop

虽然我看不到任何名为 my_rails_redis 的客户端,但属于 Actioncable 或 sidekiq 的客户端被正确标记。

我错过了什么吗?

【问题讨论】:

    标签: ruby-on-rails redis ruby-on-rails-6


    【解决方案1】:

    我的错误在 Puma 再次重启后似乎已经恢复了。

    结果很有趣,因为我希望创建一个 Redis 客户端,但现在看起来像这样:

    id=79 addr=127.0.0.1:33576 fd=19 name=Sidekiq-server-PID-21977 age=5 idle=5 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=0 events=r cmd=exec
    id=73 addr=127.0.0.1:33458 fd=11 name=my_rails_redis age=17 idle=2 flags=b db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=0 events=r cmd=brpop
    id=74 addr=127.0.0.1:33460 fd=12 name=my_rails_redis age=17 idle=0 flags=b db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=32768 obl=0 oll=0 omem=0 events=r cmd=brpop
    id=63 addr=127.0.0.1:32784 fd=15 name= age=1829 idle=0 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=32768 obl=0 oll=0 omem=0 events=r cmd=client
    id=69 addr=127.0.0.1:33450 fd=14 name=ActionCable-PID-21999 age=34 idle=14 flags=N db=0 sub=1 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=0 events=r cmd=unsubscribe
    id=80 addr=127.0.0.1:33586 fd=20 name= age=4 idle=3 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=0 events=r cmd=hget
    id=81 addr=127.0.0.1:33588 fd=21 name=ActionCable-PID-22041 age=4 idle=3 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=0 events=r cmd=publish
    id=77 addr=127.0.0.1:33568 fd=17 name=my_rails_redis age=12 idle=2 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=0 events=r cmd=exec
    id=70 addr=127.0.0.1:33452 fd=8 name=my_rails_redis age=17 idle=1 flags=b db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=0 events=r cmd=brpop
    id=71 addr=127.0.0.1:33454 fd=9 name=my_rails_redis age=17 idle=2 flags=b db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=0 events=r cmd=brpop
    id=76 addr=127.0.0.1:33566 fd=16 name=ActionCable-PID-21987 age=13 idle=3 flags=N db=0 sub=3 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=0 events=r cmd=subscribe
    id=75 addr=127.0.0.1:33464 fd=13 name= age=14 idle=14 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=0 events=r cmd=hvals
    id=72 addr=127.0.0.1:33456 fd=10 name=my_rails_redis age=17 idle=2 flags=b db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=0 events=r cmd=brpop
    id=78 addr=127.0.0.1:33574 fd=18 name= age=5 idle=5 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=0 events=r cmd=hget
    

    如果唯一创建的 Redis 客户端 redis = Redis.new(conf) 变成许多不同的客户端,我什至不确定是否需要创建一个池 ..

    谜团有待进一步挖掘..

    为那些将遇到与我相同问题的人编辑:

    实际上,我在 Sidekiq 中使用了我的 redis.yml conf。尽管命名了一些 Sidekiq redis 客户端,但还有一些没有命名(Sidekiq.rb 配置文件的服务器部分)。

    然后我从 redis.yml 中删除了id: my_rails_redis,以免使用 Redis config 破坏每个配置文件

    我改变了 Sidekiq.rb 如下:

    conf = Rails.application.config_for(:redis)
    confid = conf.merge({id: "Sidekiq-server-PID-#{::Process.pid}"})
    confservid = conf.merge({id: "Sidekiq-server"})
    
    if Rails.env.development?
      Sidekiq.configure_client do |config|         
        config.redis = confid       
      end
    
      Sidekiq.configure_server do |config|    
        config.redis = confservid    
      end
    
    end
    

    每个 Sidekiq Redis 客户端都发生了这种情况。

    另外,问题的关键,在 redis.rb 中我正在初始化一个 Redis 客户端,尽管我没有在我的代码中使用它,因为它被分配了一个本地实例(“redis”):

    conf = Rails.application.config_for(:redis)
    conf[:id] = "Rails_redis_client"
    redis = Redis.new(conf)
    

    事实上这是真的:我在我的代码中使用了Redis.currentredis 不可用。

    然后切换到一个常量:

    Red_g = Redis.new(conf)
    

    并且使用Red_g(对于 Redis_global )而不是 Redis.current 碰巧解决了我的问题:命名工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-05
      • 2020-05-14
      相关资源
      最近更新 更多