redis-store 1.0.0.1 → 1.1.0.rc

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of redis-store might be problematic. Click here for more details.

Files changed (53) hide show
  1. data/Gemfile +2 -34
  2. data/README.md +17 -220
  3. data/Rakefile +7 -54
  4. data/lib/redis-store.rb +11 -44
  5. data/lib/redis/distributed_store.rb +8 -1
  6. data/lib/redis/factory.rb +17 -21
  7. data/lib/redis/store.rb +3 -8
  8. data/lib/redis/store/interface.rb +4 -0
  9. data/lib/redis/store/marshalling.rb +4 -0
  10. data/lib/redis/store/version.rb +1 -8
  11. data/lib/tasks/redis.tasks.rb +167 -0
  12. data/redis-store.gemspec +22 -97
  13. data/{spec → test}/config/node-one.conf +2 -2
  14. data/{spec → test}/config/node-two.conf +2 -2
  15. data/{spec → test}/config/redis.conf +3 -2
  16. data/{spec/redis/distributed_store_spec.rb → test/redis/distributed_store_test.rb} +13 -15
  17. data/test/redis/factory_test.rb +98 -0
  18. data/test/redis/store/interface_test.rb +27 -0
  19. data/test/redis/store/marshalling_test.rb +127 -0
  20. data/test/redis/store/namespace_test.rb +86 -0
  21. data/test/redis/store/version_test.rb +7 -0
  22. data/test/redis/store_test.rb +17 -0
  23. data/test/test_helper.rb +22 -0
  24. metadata +85 -97
  25. data/.travis.yml +0 -7
  26. data/CHANGELOG +0 -311
  27. data/VERSION +0 -1
  28. data/lib/action_controller/session/redis_session_store.rb +0 -81
  29. data/lib/active_support/cache/redis_store.rb +0 -254
  30. data/lib/cache/merb/redis_store.rb +0 -79
  31. data/lib/cache/sinatra/redis_store.rb +0 -131
  32. data/lib/i18n/backend/redis.rb +0 -67
  33. data/lib/rack/cache/redis_entitystore.rb +0 -48
  34. data/lib/rack/cache/redis_metastore.rb +0 -40
  35. data/lib/rack/session/merb.rb +0 -32
  36. data/lib/rack/session/redis.rb +0 -88
  37. data/spec/action_controller/session/redis_session_store_spec.rb +0 -126
  38. data/spec/active_support/cache/redis_store_spec.rb +0 -426
  39. data/spec/cache/merb/redis_store_spec.rb +0 -143
  40. data/spec/cache/sinatra/redis_store_spec.rb +0 -192
  41. data/spec/i18n/backend/redis_spec.rb +0 -72
  42. data/spec/rack/cache/entitystore/pony.jpg +0 -0
  43. data/spec/rack/cache/entitystore/redis_spec.rb +0 -124
  44. data/spec/rack/cache/metastore/redis_spec.rb +0 -259
  45. data/spec/rack/session/redis_spec.rb +0 -234
  46. data/spec/redis/factory_spec.rb +0 -110
  47. data/spec/redis/store/interface_spec.rb +0 -23
  48. data/spec/redis/store/marshalling_spec.rb +0 -119
  49. data/spec/redis/store/namespace_spec.rb +0 -76
  50. data/spec/redis/store/version_spec.rb +0 -7
  51. data/spec/redis/store_spec.rb +0 -13
  52. data/spec/spec_helper.rb +0 -43
  53. data/tasks/redis.tasks.rb +0 -235
@@ -1,79 +0,0 @@
1
- module Merb
2
- module Cache
3
- class RedisStore < AbstractStore
4
- # Instantiate the store.
5
- #
6
- # Example:
7
- # RedisStore.new
8
- # # => host: localhost, port: 6379, db: 0
9
- #
10
- # RedisStore.new :servers => ["example.com"]
11
- # # => host: example.com, port: 6379, db: 0
12
- #
13
- # RedisStore.new :servers => ["example.com:23682"]
14
- # # => host: example.com, port: 23682, db: 0
15
- #
16
- # RedisStore.new :servers => ["example.com:23682/1"]
17
- # # => host: example.com, port: 23682, db: 1
18
- #
19
- # RedisStore.new :servers => ["example.com:23682/1/theplaylist"]
20
- # # => host: example.com, port: 23682, db: 1, namespace: theplaylist
21
- #
22
- # RedisStore.new :servers => ["localhost:6379/0", "localhost:6380/0"]
23
- # # => instantiate a cluster
24
- def initialize(config = { })
25
- @data = Redis::Factory.create config[:servers]
26
- end
27
-
28
- def writable?(key, parameters = {}, conditions = {})
29
- true
30
- end
31
-
32
- def read(key, parameters = {}, conditions = {})
33
- @data.get normalize(key, parameters), conditions
34
- end
35
-
36
- def write(key, data = nil, parameters = {}, conditions = {})
37
- if writable?(key, parameters, conditions)
38
- method = conditions && conditions[:unless_exist] ? :setnx : :set
39
- @data.send method, normalize(key, parameters), data, conditions
40
- end
41
- end
42
-
43
- def write_all(key, data = nil, parameters = {}, conditions = {})
44
- write key, data, parameters, conditions
45
- end
46
-
47
- def fetch(key, parameters = {}, conditions = {}, &blk)
48
- (data = read(key, parameters)) || block_given? && begin
49
- data = yield
50
- write(key, data, parameters, conditions)
51
- end
52
- data || nil
53
- end
54
-
55
- def exists?(key, parameters = {})
56
- @data.exists normalize(key, parameters)
57
- end
58
-
59
- def delete(key, parameters = {})
60
- @data.del normalize(key, parameters)
61
- end
62
-
63
- def delete_all
64
- @data.flushdb
65
- end
66
-
67
- def delete_all!
68
- delete_all
69
- end
70
-
71
- private
72
- # Returns cache key calculated from base key
73
- # and SHA2 hex from parameters.
74
- def normalize(key, parameters = {})
75
- parameters.empty? ? "#{key}" : "#{key}--#{parameters.to_sha2}"
76
- end
77
- end
78
- end
79
- end
@@ -1,131 +0,0 @@
1
- module Sinatra
2
- module Cache
3
- class << self
4
- def register(app)
5
- app.set :cache, RedisStore.new
6
- end
7
- alias_method :registered, :register
8
- end
9
-
10
- class RedisStore
11
- # Instantiate the store.
12
- #
13
- # Example:
14
- # RedisStore.new
15
- # # => host: localhost, port: 6379, db: 0
16
- #
17
- # RedisStore.new "example.com"
18
- # # => host: example.com, port: 6379, db: 0
19
- #
20
- # RedisStore.new "example.com:23682"
21
- # # => host: example.com, port: 23682, db: 0
22
- #
23
- # RedisStore.new "example.com:23682/1"
24
- # # => host: example.com, port: 23682, db: 1
25
- #
26
- # RedisStore.new "example.com:23682/1/theplaylist"
27
- # # => host: example.com, port: 23682, db: 1, namespace: theplaylist
28
- #
29
- # RedisStore.new "localhost:6379/0", "localhost:6380/0"
30
- # # => instantiate a cluster
31
- def initialize(*addresses)
32
- @data = Redis::Factory.create addresses
33
- end
34
-
35
- def write(key, value, options = nil)
36
- if options && options[:unless_exist]
37
- @data.setnx key, value, options
38
- else
39
- @data.set key, value, options
40
- end
41
- end
42
-
43
- def read(key, options = nil)
44
- @data.get(key, options)
45
- end
46
-
47
- def delete(key, options = nil)
48
- @data.del key
49
- end
50
-
51
- def exist?(key, options = nil)
52
- @data.exists key
53
- end
54
-
55
- # Increment a key in the store.
56
- #
57
- # If the key doesn't exist it will be initialized on 0.
58
- # If the key exist but it isn't a Fixnum it will be initialized on 0.
59
- #
60
- # Example:
61
- # We have two objects in cache:
62
- # counter # => 23
63
- # rabbit # => #<Rabbit:0x5eee6c>
64
- #
65
- # cache.increment "counter"
66
- # cache.read "counter", :raw => true # => "24"
67
- #
68
- # cache.increment "counter", 6
69
- # cache.read "counter", :raw => true # => "30"
70
- #
71
- # cache.increment "a counter"
72
- # cache.read "a counter", :raw => true # => "1"
73
- #
74
- # cache.increment "rabbit"
75
- # cache.read "rabbit", :raw => true # => "1"
76
- def increment(key, amount = 1)
77
- @data.incrby key, amount
78
- end
79
-
80
- # Decrement a key in the store
81
- #
82
- # If the key doesn't exist it will be initialized on 0.
83
- # If the key exist but it isn't a Fixnum it will be initialized on 0.
84
- #
85
- # Example:
86
- # We have two objects in cache:
87
- # counter # => 23
88
- # rabbit # => #<Rabbit:0x5eee6c>
89
- #
90
- # cache.decrement "counter"
91
- # cache.read "counter", :raw => true # => "22"
92
- #
93
- # cache.decrement "counter", 2
94
- # cache.read "counter", :raw => true # => "20"
95
- #
96
- # cache.decrement "a counter"
97
- # cache.read "a counter", :raw => true # => "-1"
98
- #
99
- # cache.decrement "rabbit"
100
- # cache.read "rabbit", :raw => true # => "-1"
101
- def decrement(key, amount = 1)
102
- @data.decrby key, amount
103
- end
104
-
105
- # Delete objects for matched keys.
106
- #
107
- # Example:
108
- # cache.del_matched "rab*"
109
- def delete_matched(matcher, options = nil)
110
- @data.keys(matcher).each { |key| @data.del key }
111
- end
112
-
113
- def fetch(key, options = {})
114
- (!options[:force] && data = read(key, options)) || block_given? && begin
115
- data = yield
116
- write(key, data, options)
117
- end
118
- data || nil
119
- end
120
-
121
- # Clear all the data from the store.
122
- def clear
123
- @data.flushdb
124
- end
125
-
126
- def stats
127
- @data.info
128
- end
129
- end
130
- end
131
- end
@@ -1,67 +0,0 @@
1
- module I18n
2
- module Backend
3
- class Redis
4
- include Base, Flatten
5
- attr_accessor :store
6
-
7
- # Instantiate the store.
8
- #
9
- # Example:
10
- # RedisStore.new
11
- # # => host: localhost, port: 6379, db: 0
12
- #
13
- # RedisStore.new "example.com"
14
- # # => host: example.com, port: 6379, db: 0
15
- #
16
- # RedisStore.new "example.com:23682"
17
- # # => host: example.com, port: 23682, db: 0
18
- #
19
- # RedisStore.new "example.com:23682/1"
20
- # # => host: example.com, port: 23682, db: 1
21
- #
22
- # RedisStore.new "example.com:23682/1/theplaylist"
23
- # # => host: example.com, port: 23682, db: 1, namespace: theplaylist
24
- #
25
- # RedisStore.new "localhost:6379/0", "localhost:6380/0"
26
- # # => instantiate a cluster
27
- def initialize(*addresses)
28
- @store = ::Redis::Factory.create(addresses)
29
- end
30
-
31
- def translate(locale, key, options = {})
32
- options[:resolve] ||= false
33
- super locale, key, options
34
- end
35
-
36
- def store_translations(locale, data, options = {})
37
- escape = options.fetch(:escape, true)
38
- flatten_translations(locale, data, escape, false).each do |key, value|
39
- case value
40
- when Proc
41
- raise "Key-value stores cannot handle procs"
42
- else
43
- @store.set "#{locale}.#{key}", value
44
- end
45
- end
46
- end
47
-
48
- def available_locales
49
- locales = @store.keys.map { |k| k =~ /\./; $` }
50
- locales.uniq!
51
- locales.compact!
52
- locales.map! { |k| k.to_sym }
53
- locales
54
- end
55
-
56
- protected
57
- def lookup(locale, key, scope = [], options = {})
58
- key = normalize_flat_keys(locale, key, scope, options[:separator])
59
- @store.get "#{locale}.#{key}"
60
- end
61
-
62
- def resolve_link(locale, key)
63
- key
64
- end
65
- end
66
- end
67
- end
@@ -1,48 +0,0 @@
1
- module Rack
2
- module Cache
3
- class EntityStore
4
- class RedisBase < EntityStore
5
- # The underlying ::Redis instance used to communicate with the Redis daemon.
6
- attr_reader :cache
7
-
8
- extend Rack::Utils
9
-
10
- def open(key)
11
- data = read(key)
12
- data && [data]
13
- end
14
-
15
- def self.resolve(uri)
16
- new ::Redis::Factory.convert_to_redis_client_options(uri.to_s)
17
- end
18
- end
19
-
20
- class Redis < RedisBase
21
- def initialize(server, options = {})
22
- @cache = ::Redis.new server
23
- end
24
-
25
- def exist?(key)
26
- cache.exists key
27
- end
28
-
29
- def read(key)
30
- cache.get key
31
- end
32
-
33
- def write(body)
34
- buf = StringIO.new
35
- key, size = slurp(body){|part| buf.write(part) }
36
- [key, size] if cache.set(key, buf.string)
37
- end
38
-
39
- def purge(key)
40
- cache.del key
41
- nil
42
- end
43
- end
44
-
45
- REDIS = Redis
46
- end
47
- end
48
- end
@@ -1,40 +0,0 @@
1
- module Rack
2
- module Cache
3
- class MetaStore
4
- class RedisBase < MetaStore
5
- extend Rack::Utils
6
-
7
- # The Redis::Store object used to communicate with the Redis daemon.
8
- attr_reader :cache
9
-
10
- def self.resolve(uri)
11
- new ::Redis::Factory.convert_to_redis_client_options(uri.to_s)
12
- end
13
- end
14
-
15
- class Redis < RedisBase
16
- def initialize(server, options = {})
17
- options[:redis_server] ||= server
18
- @cache = ::Redis::Factory.create options
19
- end
20
-
21
- def read(key)
22
- key = hexdigest(key)
23
- cache.get(key) || []
24
- end
25
-
26
- def write(key, entries)
27
- key = hexdigest(key)
28
- cache.set(key, entries)
29
- end
30
-
31
- def purge(key)
32
- cache.del(hexdigest(key))
33
- nil
34
- end
35
- end
36
-
37
- REDIS = Redis
38
- end
39
- end
40
- end
@@ -1,32 +0,0 @@
1
- module Merb
2
- # HACK for cyclic dependency: redis-store is required before Merb session stores
3
- class Mash < Hash; end
4
- class SessionContainer < Mash; class_inheritable_accessor :session_store_type end
5
- class SessionStoreContainer < SessionContainer; end
6
-
7
- class RedisSession < SessionStoreContainer
8
- self.session_store_type = :redis
9
- end
10
-
11
- module RedisStore
12
- def retrieve_session(session_id)
13
- get("session:#{session_id}")
14
- end
15
-
16
- def store_session(session_id, data)
17
- set("session:#{session_id}", data)
18
- end
19
-
20
- def delete_session(session_id)
21
- delete("session:#{session_id}")
22
- end
23
- end
24
- end
25
-
26
- module Rack
27
- module Session
28
- class Redis
29
- include Merb::RedisStore
30
- end
31
- end
32
- end
@@ -1,88 +0,0 @@
1
- module Rack
2
- module Session
3
- class Redis < Abstract::ID
4
- attr_reader :mutex, :pool
5
- DEFAULT_OPTIONS = Abstract::ID::DEFAULT_OPTIONS.merge :redis_server => "redis://127.0.0.1:6379/0"
6
-
7
- def initialize(app, options = {})
8
- super
9
- @mutex = Mutex.new
10
- options[:redis_server] ||= @default_options[:redis_server]
11
- @pool = ::Redis::Factory.create options
12
- end
13
-
14
- def generate_sid
15
- loop do
16
- sid = super
17
- break sid unless @pool.get(sid)
18
- end
19
- end
20
-
21
- def get_session(env, sid)
22
- session = @pool.get(sid) if sid
23
- @mutex.lock if env['rack.multithread']
24
- unless sid and session
25
- env['rack.errors'].puts("Session '#{sid.inspect}' not found, initializing...") if $VERBOSE and not sid.nil?
26
- session = {}
27
- sid = generate_sid
28
- ret = @pool.set sid, session
29
- raise "Session collision on '#{sid.inspect}'" unless ret
30
- end
31
- session.instance_variable_set('@old', {}.merge(session))
32
- return [sid, session]
33
- rescue Errno::ECONNREFUSED
34
- warn "#{self} is unable to find server."
35
- warn $!.inspect
36
- return [ nil, {} ]
37
- ensure
38
- @mutex.unlock if env['rack.multithread']
39
- end
40
-
41
- def set_session(env, session_id, new_session, options)
42
- @mutex.lock if env['rack.multithread']
43
- session = @pool.get(session_id) rescue {}
44
- if options[:renew] or options[:drop]
45
- @pool.del session_id
46
- return false if options[:drop]
47
- session_id = generate_sid
48
- @pool.set session_id, 0
49
- end
50
- old_session = new_session.instance_variable_get('@old') || {}
51
- session = merge_sessions session_id, old_session, new_session, session
52
- @pool.set session_id, session, options
53
- return session_id
54
- rescue Errno::ECONNREFUSED
55
- warn "#{self} is unable to find server."
56
- warn $!.inspect
57
- return false
58
- ensure
59
- @mutex.unlock if env['rack.multithread']
60
- end
61
-
62
- def destroy_session(env, session_id, options)
63
- options = { :renew => true }.update(options) unless options[:drop]
64
- set_session(env, session_id, 0, options)
65
- end
66
-
67
- private
68
- def merge_sessions(sid, old, new, cur=nil)
69
- cur ||= {}
70
- unless Hash === old and Hash === new
71
- warn 'Bad old or new sessions provided.'
72
- return cur
73
- end
74
-
75
- delete = old.keys - new.keys
76
- warn "//@#{sid}: dropping #{delete*','}" if $DEBUG and not delete.empty?
77
- delete.each{|k| cur.delete k }
78
-
79
- update = new.keys.select{|k| new[k] != old[k] }
80
- warn "//@#{sid}: updating #{update*','}" if $DEBUG and not update.empty?
81
- update.each{|k| cur[k] = new[k] }
82
-
83
- cur
84
- end
85
- end
86
- end
87
- end
88
-