diff --git a/.travis.yml b/.travis.yml
index 950fb65..363987a 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -10,6 +10,9 @@ rvm:
services:
- redis-server
+before_install:
+ - gem install bundler
+
before_script:
- git submodule update --init --recursive
diff --git a/README.md b/README.md
index e22755f..bd13775 100644
--- a/README.md
+++ b/README.md
@@ -34,7 +34,27 @@ The full list of settings is as follows.
* `:database` - number of database to use, default is `0`
* `:namespace` - prefix applied to all keys, default is `''`
* `:socket` - path to Unix socket if `unixsocket` is set
+* `:master_name` - name of the master, controlling sentinels, default is `nil`
+* `:sentinels` - array of sentinels, default is `nil`
+Sentinels could be specified as follows
+
+```rb
+sentinels = [
+ 'your_redis_host.com:26379',
+ 'your_redis_host.com:26380',
+ 'your_redis_host.com:26381'
+ ]
+
+sentinels = [
+ {url:'blah://sentinel5.example.net:26381'},
+ {url:'blah://sentinel5.example.net:26382'},
+ {url:'blah://sentinel5.example.net:26383'}
+ ]
+```
+When you specify sentinels, you should also specify master name.
+Gem em-hiredis-sentinel is used in order to get sentinel technology support
+https://github.com/livehelpnow/em-hiredis-sentinel
## License
diff --git a/faye-redis.gemspec b/faye-redis.gemspec
index 1545c3f..02c63bf 100644
--- a/faye-redis.gemspec
+++ b/faye-redis.gemspec
@@ -14,8 +14,9 @@ Gem::Specification.new do |s|
Dir.glob('lib/**/*.rb')
s.add_dependency 'eventmachine', '>= 0.12.0'
- s.add_dependency 'em-hiredis', '>= 0.2.0'
+ s.add_dependency 'em-hiredis', '>= 0.3.0'
s.add_dependency 'multi_json', '>= 1.0.0'
+ s.add_dependency 'em-hiredis-sentinel', '>= 0.2.3'
s.add_development_dependency 'rspec'
s.add_development_dependency 'rspec-eventmachine'
diff --git a/lib/faye/redis.rb b/lib/faye/redis.rb
index 5dd09fb..192057b 100644
--- a/lib/faye/redis.rb
+++ b/lib/faye/redis.rb
@@ -1,4 +1,5 @@
require 'em-hiredis'
+require 'em-hiredis-sentinel'
require 'multi_json'
module Faye
@@ -32,8 +33,14 @@ def init
gc = @options[:gc] || DEFAULT_GC
@ns = @options[:namespace] || ''
socket = @options[:socket] || nil
-
- if uri
+ sentinels = @options[:sentinels] || nil
+ master_name = @options[:master_name] || nil
+
+ if sentinels && master_name
+ @redis = EventMachine::Hiredis::Sentinel::RedisClient.new(sentinels: sentinels,
+ master_name: master_name).connect
+ @server.debug 'Redis has been initialized with sentinels'
+ elsif uri
@redis = EventMachine::Hiredis.connect(uri)
elsif socket
@redis = EventMachine::Hiredis::Client.new(socket, nil, auth, db).connect
@@ -177,7 +184,7 @@ def empty_queue(client_id)
@redis.multi
@redis.lrange(key, 0, -1)
@redis.del(key)
- @redis.exec.callback do |json_messages, deleted|
+ @redis.exec.callback do |json_messages, deleted|
next unless json_messages
messages = json_messages.map { |json| MultiJson.load(json) }
@server.deliver(client_id, messages)
@@ -234,7 +241,5 @@ def with_lock(lock_name, &block)
end
end
end
-
end
end
-