rails console在需要redis时返回false

时间:2017-06-22 11:48:53

标签: ruby-on-rails redis

我刚刚开始使用redis,我的rails应用程序设置了redis。我的redis服务器正在运行但是当我进入rails控制台并输入require 'redis'时,我得到一个错误的值。我的问题是如何在安装gem 'redis', '~> 3.3', '>= 3.3.3'后解决这个问题。我在哪里需要redis at我的rails应用程序,以便可以连接到redis。

rails console

irb(main):001:0> require 'redis'
=> false
irb(main):002:0> require 'redis'
=> false
irb(main):003:0> reload!
Reloading...
=> true
irb(main):004:0> require 'redis'
=> false
irb(main):005:0>

1 个答案:

答案 0 :(得分:0)

如果您看一下有关require

的文档
  

加载给定名称,如果成功则返回true,如果已加载该功能则返回false。

所以当你运行rails控制台时,已经加载了很多宝石,你可以开始使用它,而不需要。

可能你在config / initializers中有一个带有这个内容的ruby初始化器:

require 'redis'
require 'redis/objects'

加载完毕后,您可以在控制台中开始使用Redis。

irb(main):043:0> my_redis = Redis.new(:host => ::APP_CONFIG[:redis_server][:host],
                          :port => ::APP_CONFIG[:redis_server][:port],
                          :timeout => ::APP_CONFIG[:redis_server][:timeout]
                         )
irb(main):044:1* irb(main):045:1* irb(main):046:1> => #<Redis client v3.0.7 for redis://127.0.0.1:6379/0>
irb(main):047:0> my_redis.set "foo", [1, 2, 3].to_json
=> "OK"
irb(main):048:0> JSON.parse(my_redis.get("foo"))
=> [1, 2, 3]

最后,当您尝试加载不存在的库时,会出现错误

irb(main):023:0> require 'patata'
LoadError: cannot load such file -- patata

对于redis配置,只需创建文件config/initializers/redis.rbconfig/redis.yml,请参阅此要点gist see this

代码:

#config/initializers/redis.rb
require 'redis'
require 'redis/objects'

REDIS_CONFIG = YAML.load( File.open( Rails.root.join("config/redis.yml") ) ).symbolize_keys
dflt = REDIS_CONFIG[:default].symbolize_keys
cnfg = dflt.merge(REDIS_CONFIG[Rails.env.to_sym].symbolize_keys) if REDIS_CONFIG[Rails.env.to_sym]

$redis = Redis.new(cnfg)
Redis::Objects.redis = $redis
#$redis_ns = Redis::Namespace.new(cnfg[:namespace], :redis => $redis) if cnfg[:namespace]

# To clear out the db before each test
$redis.flushdb if Rails.env = "test"

#config/redis.yml
default:
  host: localhost
  port: 6379
development:
  db: 0
#  namespace: appname_dev
test:
  db: 1
#  namespace: appname_test
production:
  db: 2
  host: 192.168.1.100
#  namespace: appname_prod

最后,redis客户端初始化程序的允许和默认参数是:

 DEFAULTS = {
      :url => lambda { ENV["REDIS_URL"] },
      :scheme => "redis",
      :host => "127.0.0.1",
      :port => 6379,
      :path => nil,
      :timeout => 5.0,
      :password => nil,
      :db => 0,
      :driver => nil,
      :id => nil,
      :tcp_keepalive => 0,
      :reconnect_attempts => 1,
      :inherit_socket => false
    }