Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
Redis config and initialization for rails
#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
@MatthiasWinkelmann

This comment has been minimized.

Copy link

@MatthiasWinkelmann MatthiasWinkelmann commented May 11, 2016

Warning, Will Robinson!

https://gist.github.com/pubis/1459506#file-redis-rb:14 has the classic '=' vs. '==' bug.

If you're wondering why your Redis FB is reset every time you restart, the line

$redis.flushdb if Rails.env = "test"

should obviously be

$redis.flushdb if Rails.env == "test"

@jonopray

This comment has been minimized.

Copy link

@jonopray jonopray commented Aug 16, 2016

cnfg = dflt.merge(REDIS_CONFIG[Rails.env.to_sym].symbolize_keys) if REDIS_CONFIG[Rails.env.to_sym] will be set to nil rather than the default if Rails.env is not a key in REDIS_CONFIG.

@coconup

This comment has been minimized.

Copy link

@coconup coconup commented Jul 27, 2017

Something easier and more up to date:

config/redis.yml

default: &default
  url: redis://localhost:6379
  db: 1

development:
  <<: *default
test:
  <<: *default
production:
  <<: *default
  url: redis://somehost:6379

lib/redis_cache.rb

class RedisCache
  def self.new
    Redis.new(Rails.application.config_for(:redis))
  end
end

config/initializers/redis_cache.rb

module MyApp
  class Application < Rails::Application
    config.autoload_paths += Dir[File.join(Rails.root, "lib", "redis_cache.rb")].each {|l| require l }
  end
end

Usage:

RedisCache.new.set("some_key", "some_value")

@onesneakymofo

This comment has been minimized.

Copy link

@onesneakymofo onesneakymofo commented Sep 22, 2017

Modified @coconup's example:

# config/redis.yml

default: &default
  url: redis://localhost:6379
  db: 0

development:
  <<: *default

test:
  <<: *default

production:
  <<: *default
  url: redis://somehost:6379
# lib/redis.rb

$redis = Redis.new(Rails.application.config_for(:redis))
# config/initializers/redis.rb
# You can probably move this to the autoload_paths in your regular config/application.rb

Rails.application.config.autoload_paths += Dir[File.join(Rails.root, "lib", "redis.rb")].each {|l| require l }

Usage:

$ $redis.set("foo", "bar")
> "OK"
$ $redis.get("foo")
> "bar"
@abla00

This comment has been minimized.

Copy link

@abla00 abla00 commented Feb 23, 2018

This is really helpful and here is a reminder.
I got the error when running RSpec:

There was an error while trying to load the gem 'redis'.
Gem Load Error is: uninitialized constant Redis

I fix it by renaming lib/redis.rb to other name, ex: lib/foo.rb
Maybe the file name redis.rb is confused with the gem lib redis.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment