redis-memo 0.0.0.alpha → 0.0.0.beta.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,87 @@
1
+ # frozen_string_literal: true
2
+
3
+ class RedisMemo::Options
4
+ def initialize(
5
+ async: nil,
6
+ compress: nil,
7
+ compress_threshold: nil,
8
+ redis: nil,
9
+ redis_error_handler: nil,
10
+ tracer: nil,
11
+ global_cache_key_version: nil,
12
+ expires_in: nil
13
+ )
14
+ @compress = compress.nil? ? true : compress
15
+ @compress_threshold = compress_threshold || 1.kilobyte
16
+ @redis_config = redis
17
+ @redis_client = nil
18
+ @redis_error_handler = redis_error_handler
19
+ @tracer = tracer
20
+ @logger = logger
21
+ @global_cache_key_version = global_cache_key_version
22
+ @expires_in = expires_in
23
+ end
24
+
25
+ def redis
26
+ @redis_client ||= RedisMemo::Redis.new(redis_config)
27
+ end
28
+
29
+ def redis_config
30
+ @redis_config || {}
31
+ end
32
+
33
+ def redis=(config)
34
+ @redis_config = config
35
+ @redis_client = nil
36
+ redis
37
+ end
38
+
39
+ def tracer(&blk)
40
+ if blk.nil?
41
+ return @tracer if @tracer.respond_to?(:trace)
42
+
43
+ @tracer&.call
44
+ else
45
+ @tracer = blk
46
+ end
47
+ end
48
+
49
+ def logger(&blk)
50
+ if blk.nil?
51
+ return @logger if @logger.respond_to?(:warn)
52
+
53
+ @logger&.call
54
+ else
55
+ @logger = blk
56
+ end
57
+ end
58
+
59
+ def global_cache_key_version(&blk)
60
+ # this method takes a block to be consistent with the inline memo_method
61
+ # API
62
+ if blk.nil?
63
+ if !@global_cache_key_version.respond_to?(:call)
64
+ return @global_cache_key_version
65
+ end
66
+
67
+ @global_cache_key_version&.call
68
+ else
69
+ # save the global cache_key_version eagerly
70
+ @global_cache_key_version = blk
71
+ end
72
+ end
73
+
74
+ attr_accessor :async
75
+ attr_accessor :bulk_operations_invalidation_limit
76
+ attr_accessor :cache_out_of_date_handler
77
+ attr_accessor :cache_validation_sampler
78
+ attr_accessor :compress
79
+ attr_accessor :compress_threshold
80
+ attr_accessor :connection_pool
81
+ attr_accessor :expires_in
82
+ attr_accessor :redis_error_handler
83
+
84
+ attr_writer :global_cache_key_version
85
+ attr_writer :tracer
86
+ attr_writer :logger
87
+ end
@@ -0,0 +1,67 @@
1
+ # frozen_string_literal: true
2
+ require 'redis'
3
+ require 'redis/distributed'
4
+
5
+ require_relative 'options'
6
+
7
+ # Redis::Distributed does not support reading from multiple read replicas. This
8
+ # class adds this functionality
9
+ class RedisMemo::Redis < Redis::Distributed
10
+ def initialize(options={})
11
+ clients =
12
+ if options.is_a?(Array)
13
+ options.map do |option|
14
+ if option.is_a?(Array)
15
+ RedisMemo::Redis::WithReplicas.new(option)
16
+ else
17
+ option[:logger] ||= RedisMemo::DefaultOptions.logger
18
+ ::Redis.new(option)
19
+ end
20
+ end
21
+ else
22
+ options[:logger] ||= RedisMemo::DefaultOptions.logger
23
+ [::Redis.new(options)]
24
+ end
25
+
26
+ # Pass in our own hash ring to use the clients with multi-read-replica
27
+ # support
28
+ hash_ring = Redis::HashRing.new(clients)
29
+
30
+ super([], ring: hash_ring)
31
+ end
32
+
33
+ class WithReplicas < ::Redis
34
+ def initialize(options)
35
+ primary_option = options.shift
36
+ @replicas = options.map do |option|
37
+ option[:logger] ||= RedisMemo::DefaultOptions.logger
38
+ ::Redis.new(option)
39
+ end
40
+
41
+ primary_option[:logger] ||= RedisMemo::DefaultOptions.logger
42
+ super(primary_option)
43
+ end
44
+
45
+ alias_method :get_primary, :get
46
+ alias_method :mget_primary, :mget
47
+ alias_method :mapped_mget_primary, :mapped_mget
48
+
49
+ def get(key)
50
+ return get_primary(key) if @replicas.empty?
51
+
52
+ @replicas.sample(1).first.get(key)
53
+ end
54
+
55
+ def mget(*keys, &blk)
56
+ return mget_primary(*keys, &blk) if @replicas.empty?
57
+
58
+ @replicas.sample(1).first.mget(*keys)
59
+ end
60
+
61
+ def mapped_mget(*keys)
62
+ return mapped_mget_primary(*keys) if @replicas.empty?
63
+
64
+ @replicas.sample(1).first.mapped_mget(*keys)
65
+ end
66
+ end
67
+ end
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+ require_relative 'options'
3
+
4
+ class RedisMemo::Tracer
5
+ def self.trace(span_name, method_id, &blk)
6
+ tracer = RedisMemo::DefaultOptions.tracer
7
+ return blk.call if tracer.nil?
8
+
9
+ tracer.trace(span_name, resource: method_id, service: 'redis_memo') do
10
+ blk.call
11
+ end
12
+ end
13
+
14
+ def self.set_tag(**tags)
15
+ tracer = RedisMemo::DefaultOptions.tracer
16
+ return if tracer.nil? || !tracer.respond_to?(:active_span)
17
+
18
+ active_span = tracer.active_span
19
+ return if !active_span.respond_to?(:set_tag)
20
+
21
+ tags.each do |name, value|
22
+ active_span.set_tag(name, value)
23
+ end
24
+ end
25
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: redis-memo
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.0.alpha
4
+ version: 0.0.0.beta.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Chan Zuckerberg Initiative
@@ -10,48 +10,76 @@ bindir: bin
10
10
  cert_chain: []
11
11
  date: 2020-10-31 00:00:00.000000000 Z
12
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: activesupport
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '5.2'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '5.2'
13
27
  - !ruby/object:Gem::Dependency
14
28
  name: redis
15
29
  requirement: !ruby/object:Gem::Requirement
16
30
  requirements:
17
- - - "~>"
31
+ - - ">="
18
32
  - !ruby/object:Gem::Version
19
- version: '4'
33
+ version: 4.0.1
20
34
  type: :runtime
21
35
  prerelease: false
22
36
  version_requirements: !ruby/object:Gem::Requirement
23
37
  requirements:
24
- - - "~>"
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: 4.0.1
41
+ - !ruby/object:Gem::Dependency
42
+ name: connection_pool
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: 2.2.3
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
25
53
  - !ruby/object:Gem::Version
26
- version: '4'
54
+ version: 2.2.3
27
55
  - !ruby/object:Gem::Dependency
28
- name: sorbet
56
+ name: activerecord
29
57
  requirement: !ruby/object:Gem::Requirement
30
58
  requirements:
31
59
  - - ">="
32
60
  - !ruby/object:Gem::Version
33
- version: 0.4.4704
61
+ version: '5.2'
34
62
  type: :development
35
63
  prerelease: false
36
64
  version_requirements: !ruby/object:Gem::Requirement
37
65
  requirements:
38
66
  - - ">="
39
67
  - !ruby/object:Gem::Version
40
- version: 0.4.4704
68
+ version: '5.2'
41
69
  - !ruby/object:Gem::Dependency
42
- name: sorbet-static
70
+ name: activerecord-import
43
71
  requirement: !ruby/object:Gem::Requirement
44
72
  requirements:
45
73
  - - ">="
46
74
  - !ruby/object:Gem::Version
47
- version: 0.4.4704
75
+ version: '0'
48
76
  type: :development
49
77
  prerelease: false
50
78
  version_requirements: !ruby/object:Gem::Requirement
51
79
  requirements:
52
80
  - - ">="
53
81
  - !ruby/object:Gem::Version
54
- version: 0.4.4704
82
+ version: '0'
55
83
  - !ruby/object:Gem::Dependency
56
84
  name: codecov
57
85
  requirement: !ruby/object:Gem::Requirement
@@ -66,6 +94,48 @@ dependencies:
66
94
  - - ">="
67
95
  - !ruby/object:Gem::Version
68
96
  version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: database_cleaner-active_record
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: pg
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
125
+ - !ruby/object:Gem::Dependency
126
+ name: rake
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ">="
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ">="
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
69
139
  - !ruby/object:Gem::Dependency
70
140
  name: rspec
71
141
  requirement: !ruby/object:Gem::Requirement
@@ -100,7 +170,29 @@ executables: []
100
170
  extensions: []
101
171
  extra_rdoc_files: []
102
172
  files:
173
+ - lib/redis-memo.rb
103
174
  - lib/redis_memo.rb
175
+ - lib/redis_memo/after_commit.rb
176
+ - lib/redis_memo/batch.rb
177
+ - lib/redis_memo/cache.rb
178
+ - lib/redis_memo/connection_pool.rb
179
+ - lib/redis_memo/future.rb
180
+ - lib/redis_memo/memoizable.rb
181
+ - lib/redis_memo/memoizable/dependency.rb
182
+ - lib/redis_memo/memoizable/invalidation.rb
183
+ - lib/redis_memo/memoize_method.rb
184
+ - lib/redis_memo/memoize_query.rb
185
+ - lib/redis_memo/memoize_query/cached_select.rb
186
+ - lib/redis_memo/memoize_query/cached_select/bind_params.rb
187
+ - lib/redis_memo/memoize_query/cached_select/connection_adapter.rb
188
+ - lib/redis_memo/memoize_query/cached_select/statement_cache.rb
189
+ - lib/redis_memo/memoize_query/invalidation.rb
190
+ - lib/redis_memo/memoize_query/memoize_table_column.rb
191
+ - lib/redis_memo/memoize_query/model_callback.rb
192
+ - lib/redis_memo/middleware.rb
193
+ - lib/redis_memo/options.rb
194
+ - lib/redis_memo/redis.rb
195
+ - lib/redis_memo/tracer.rb
104
196
  homepage: https://github.com/chanzuckerberg/redis-memo
105
197
  licenses:
106
198
  - MIT
@@ -120,9 +212,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
120
212
  - !ruby/object:Gem::Version
121
213
  version: 1.3.1
122
214
  requirements: []
123
- rubyforge_project:
124
- rubygems_version: 2.7.6.2
215
+ rubygems_version: 3.0.8
125
216
  signing_key:
126
217
  specification_version: 4
127
- summary: Redis based memoization
218
+ summary: A Redis-based version-addressable caching system. Memoize pure functions,
219
+ aggregated database queries, and 3rd party API calls.
128
220
  test_files: []