cache_store_redis 0.4.4 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: fd69f7d92e6f813f3481e3282c27920ebb8e5ac8
4
- data.tar.gz: 564d1e71c9e8979269eca486eb07505efafdea5d
3
+ metadata.gz: 5f09f961f03ff2ebfa552c67f2cd8e68ca90d4d7
4
+ data.tar.gz: edbcce0a3fb317ae7a1e3659d6edd5c524141cf4
5
5
  SHA512:
6
- metadata.gz: d33040844b967f87fc44914634b22fffd00682745bbcd664c4d71c3ecdc99c7723203075e86265418b6ae6b4dc3e67ed653b28a9bae2da789c2f1c0a96fe621f
7
- data.tar.gz: 1b4a1fea76014580a58b6889c2ba7b721319142ec1364da8bccc336b20e8c1cab942d88d6829524d16499d3326ec8d6652f6359d067cedb5c01b5923ae388120
6
+ metadata.gz: 84bd996123e42b669a1c2851d8cc4e83e8181b285e10217ce15a560ac8cc65a5c015a40b58b2a63161e8b6e98c27ff499043f3943c5bcb49b1e3d30d769d6096
7
+ data.tar.gz: 1a5ddbd79f7da39d5249b1a298414ee5d0330b0e8110400d4b4d65f3d52b5b0576c67226c8b4c80c3f9a360ea83e869e4d59cedf102caf5cf85ab4ed3f9fa5f9
@@ -1,3 +1,3 @@
1
1
  module CacheStoreRedis
2
- VERSION = '0.4.4'
2
+ VERSION = '0.5.0'
3
3
  end
@@ -1,117 +1,159 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'thread'
1
4
  require 'cache_store_redis/version'
2
5
  require 'redis'
3
6
  require 'securerandom'
4
- require 'connection_pool'
5
7
 
6
- #This class is used to implement a redis cache store.
7
- #This class is used for interacting with a redis based cache store.
8
+ # This class is used to implement a redis cache store.
8
9
  class RedisCacheStore
9
-
10
- def self.pool(config)
11
- @pool ||= ConnectionPool.new(size: pool_size, timeout: pool_timeout) do
12
- if config == nil
13
- Redis.new
14
- else
15
- Redis.new(config)
16
- end
10
+ def initialize(namespace = nil, config = nil)
11
+ unless RUBY_PLATFORM == 'java'
12
+ require 'oj'
17
13
  end
18
- end
19
14
 
20
- def self.pool_size
21
- @pool_size ||= Integer(ENV['CACHE_STORE_POOL_SIZE'] || 20)
22
- end
15
+ @namespace = namespace
16
+ @config = config
17
+ @queue = Queue.new
23
18
 
24
- def self.pool_timeout
25
- @pool_size ||= Integer(ENV['CACHE_STORE_POOL_TIMEOUT'] || 1)
19
+ @connections_created = 0
20
+ @connections_in_use = 0
21
+ @mutex = Mutex.new
22
+ @enable_stats = false
26
23
  end
27
24
 
28
- def initialize(namespace = nil, config = nil)
25
+ def enable_stats=(value)
26
+ @enable_stats = value
27
+ end
29
28
 
30
- if RUBY_PLATFORM != 'java'
31
- require 'oj'
29
+ def increment_created_stat
30
+ @mutex.synchronize do
31
+ @connections_created += 1
32
32
  end
33
+ end
33
34
 
34
- @namespace = namespace
35
- @config = config
35
+ def increment_using_stat
36
+ @mutex.synchronize do
37
+ @connections_in_use += 1
38
+ end
36
39
  end
37
40
 
38
- def with_client
39
- if self.class.pool_size > 0
40
- self.class.pool(@config).with(timeout: self.class.pool_timeout) do |client|
41
- raise 'nil redis client returned from pool' if client.nil?
42
- yield client
43
- end
44
- else
45
- # allow single client to be used when pool size is zero
46
- @client ||= Redis.new(@config)
47
- yield @client
41
+ def decrement_using_stat
42
+ @mutex.synchronize do
43
+ @connections_in_use -= 1
48
44
  end
49
45
  end
50
46
 
51
- #This method is called to configure the connection to the cache store.
52
- def configure(host = 'localhost', port = 6379, db = 'default', password = nil, driver: nil, url: nil)
53
- if url != nil
47
+ # This method is called to configure the connection to the cache store.
48
+ def configure(host = 'localhost',
49
+ port = 6379,
50
+ db = 'default',
51
+ password = nil,
52
+ driver: nil,
53
+ url: nil,
54
+ connect_timeout: 0.5,
55
+ read_timeout: 1,
56
+ write_timeout: 0.5)
57
+ if !url.nil?
54
58
  @config = {}
55
59
  @config[:url] = url
56
60
  @config[:db] = db
57
61
  else
58
- @config = { :host => host, :port => port, :db => db }
62
+ @config = { host: host, port: port, db: db }
59
63
  end
60
- if password != nil
61
- @config[:password] = password
64
+
65
+ @config[:password] = password unless password .nil?
66
+ @config[:driver] = driver unless driver.nil?
67
+
68
+ @config[:connect_timeout] = connect_timeout
69
+ @config[:read_timeout] = read_timeout
70
+ @config[:write_timeout] = write_timeout
71
+ end
72
+
73
+ def fetch_client
74
+ begin
75
+ @queue.pop(true)
76
+ rescue
77
+ increment_created_stat
78
+ Redis.new(@config)
79
+ end
80
+ end
81
+
82
+ def clean
83
+ while @queue.length.positive?
84
+ client = @queue.pop(true)
85
+ client.close
62
86
  end
63
- if driver != nil
64
- @config[:driver] = driver
87
+ end
88
+
89
+ def log_stats
90
+ return unless @enable_stats == true
91
+ S1Logging.logger.debug do
92
+ "[#{self.class}] - REDIS Connection Stats. Process: #{Process.pid} | " \
93
+ "Created: #{@connections_created} | Pending: #{@queue.length} | In use: #{@connections_in_use}"
94
+ end
95
+ end
96
+
97
+ def with_client
98
+ log_stats
99
+ begin
100
+ client = fetch_client
101
+ increment_using_stat
102
+ log_stats
103
+ yield client
104
+ ensure
105
+ @queue.push(client)
106
+ decrement_using_stat
107
+ log_stats
65
108
  end
66
109
  end
67
110
 
68
- #This method is called to set a value within this cache store by it's key.
111
+ # This method is called to set a value within this cache store by it's key.
69
112
  #
70
113
  # @param key [String] This is the unique key to reference the value being set within this cache store.
71
114
  # @param value [Object] This is the value to set within this cache store.
72
115
  # @param expires_in [Integer] This is the number of seconds from the current time that this value should expire.
73
116
  def set(key, value, expires_in = 0)
74
- v = nil
75
117
  k = build_key(key)
76
118
 
77
- if value != nil
78
- v = serialize(value)
79
- end
119
+ v = if value.nil?
120
+ nil
121
+ else
122
+ serialize(value)
123
+ end
80
124
 
81
125
  with_client do |client|
82
126
  client.multi do
83
127
  client.set(k, v)
84
128
 
85
- if expires_in > 0
86
- client.expire(k, expires_in)
87
- end
129
+ client.expire(k, expires_in) if expires_in.positive?
88
130
  end
89
131
  end
90
-
91
132
  end
92
133
 
93
- #This method is called to get a value from this cache store by it's unique key.
134
+ # This method is called to get a value from this cache store by it's unique key.
94
135
  #
95
136
  # @param key [String] This is the unique key to reference the value to fetch from within this cache store.
96
- # @param expires_in [Integer] This is the number of seconds from the current time that this value should expire. (This is used in conjunction with the block to hydrate the cache key if it is empty.)
97
- # @param &block [Block] This block is provided to hydrate this cache store with the value for the request key when it is not found.
137
+ # @param expires_in [Integer] This is the number of seconds from the current time that this value should expire.
138
+ # (This is used in conjunction with the block to hydrate the cache key if it is empty.)
139
+ # @param &block [Block] This block is provided to hydrate this cache store with the value for the request key
140
+ # when it is not found.
98
141
  # @return [Object] The value for the specified unique key within the cache store.
99
142
  def get(key, expires_in = 0, &block)
100
-
101
143
  k = build_key(key)
102
144
 
103
145
  value = with_client do |client|
104
146
  client.get(k)
105
147
  end
106
148
 
107
- value = deserialize(value) unless value == nil
149
+ value = deserialize(value) unless value.nil?
108
150
 
109
151
  if value.nil? && block_given?
110
152
  value = yield
111
153
  set(k, value, expires_in)
112
154
  end
113
155
 
114
- return value
156
+ value
115
157
  end
116
158
 
117
159
  # This method is called to remove a value from this cache store by it's unique key.
@@ -142,7 +184,6 @@ class RedisCacheStore
142
184
  end
143
185
  end
144
186
 
145
-
146
187
  private
147
188
 
148
189
  def serialize(object)
@@ -162,13 +203,10 @@ class RedisCacheStore
162
203
  end
163
204
 
164
205
  def build_key(key)
165
- k = ''
166
- if @namespace != nil
167
- k = @namespace + ':' + key.to_s
168
- elsif
169
- k = key.to_s
206
+ if !@namespace.nil?
207
+ @namespace + ':' + key.to_s
208
+ else
209
+ key.to_s
170
210
  end
171
- k
172
211
  end
173
-
174
212
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cache_store_redis
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.4
4
+ version: 0.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - vaughanbrittonsage
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2018-01-04 00:00:00.000000000 Z
11
+ date: 2018-01-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -66,20 +66,6 @@ dependencies:
66
66
  - - ">="
67
67
  - !ruby/object:Gem::Version
68
68
  version: '0'
69
- - !ruby/object:Gem::Dependency
70
- name: connection_pool
71
- requirement: !ruby/object:Gem::Requirement
72
- requirements:
73
- - - ">="
74
- - !ruby/object:Gem::Version
75
- version: '0'
76
- type: :runtime
77
- prerelease: false
78
- version_requirements: !ruby/object:Gem::Requirement
79
- requirements:
80
- - - ">="
81
- - !ruby/object:Gem::Version
82
- version: '0'
83
69
  - !ruby/object:Gem::Dependency
84
70
  name: oj
85
71
  requirement: !ruby/object:Gem::Requirement