redis_hash_store 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: cd8dae43115ff26b94577eac604e79186603f8183c1aebb8ca4a5407561845aa
4
+ data.tar.gz: 90d4ea6b6c613070156d3a7a8517dab0627e49d59ec1f207cc9627a6208d54e3
5
+ SHA512:
6
+ metadata.gz: 283dd098e93664eb5d990e77932fc550cd4414b174399cce115a182c60a1706eff9e53256ac7e83eb62a6b0b6e27c569b98a2c58635b2e6c6ac46e0d726d09cb
7
+ data.tar.gz: 230b1a0e564b57f1316a00b495eb2545ea3ef859200ec1faf9e7b7e0eab17ae81a41181a8418aee02b9070a46c8b9afa6fc073468e4b5ab5b7d635950b34917d
@@ -0,0 +1,119 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ActiveSupport
4
+ module Cache
5
+ class RedisHashStore < RedisCacheStore
6
+ MISSING_BLOCK_MSG = "Missing block: Calling `Cache#fetch` with `force: true` requires a block."
7
+
8
+ def initialize(options)
9
+ super(**options)
10
+ end
11
+
12
+ def write_hash_value(prefix, key, value, **options)
13
+ instrument(:write_hash_value, [prefix, key], options) do
14
+ entry = Entry.new(value, **options)
15
+ write_hash_entry(prefix, key, entry)
16
+ end
17
+ end
18
+
19
+ def read_hash_value(prefix, key)
20
+ instrument(:read_hash_value, [prefix, key]) do |payload|
21
+ entry = read_hash_entry(prefix, key)
22
+
23
+ if entry
24
+ if entry.expired?
25
+ delete_hash_entry(key)
26
+ payload[:hit] = false if payload
27
+ nil
28
+ else
29
+ payload[:hit] = true if payload
30
+ entry.value
31
+ end
32
+ else
33
+ payload[:hit] = false if payload
34
+ nil
35
+ end
36
+ end
37
+ end
38
+
39
+ def fetch_hash_value(prefix, key, **options)
40
+ force = options[:force]
41
+
42
+ raise(ArgumentError, MISSING_BLOCK_MSG) if !block_given? && force
43
+
44
+ if block_given?
45
+ entry = read_hash_value(prefix, key)
46
+
47
+ return entry if entry.present? && !force
48
+
49
+ write_hash_value(prefix, key, yield, options)
50
+ end
51
+
52
+ read_hash_value(prefix, key)
53
+ end
54
+
55
+ def delete_hash_value(prefix, key)
56
+ instrument(:delete_hash_value, [prefix, key]) do
57
+ delete_hash_entry(prefix, key)
58
+ end
59
+ end
60
+
61
+ def read_hash(prefix)
62
+ instrument(:read_hash, prefix) do
63
+ read_hash_entries(prefix).map do |key, entry|
64
+ if entry.expired?
65
+ delete_hash_entry(prefix, key)
66
+ nil
67
+ else
68
+ [key, entry.value]
69
+ end
70
+ end.compact.to_h
71
+ end
72
+ end
73
+
74
+ def delete_hash(prefix)
75
+ instrument(:delete_hash, prefix) do
76
+ delete_hash_entries(prefix)
77
+ end
78
+ end
79
+
80
+ private
81
+
82
+ def delete_hash_entry(prefix, key)
83
+ failsafe(:delete_hash_entry, returning: false) do
84
+ redis.with { |c| c.hdel(prefix, key) }
85
+ end
86
+ end
87
+
88
+ def read_hash_entry(prefix, key)
89
+ failsafe(:read_hash_entry) do
90
+ deserialize_entry(redis.with { |c| c.hget(prefix, key) }, raw: false)
91
+ end
92
+ end
93
+
94
+ def write_hash_entry(prefix, key, entry)
95
+ serialized_entry = serialize_entry(entry)
96
+
97
+ failsafe(:write_hash_entry, returning: false) do
98
+ redis.with do |connection|
99
+ connection.hset(prefix, key, serialized_entry)
100
+ end
101
+ end
102
+ end
103
+
104
+ def read_hash_entries(prefix)
105
+ failsafe(:write_hash_entry, returning: false) do
106
+ redis.with do |connection|
107
+ connection.hgetall(prefix).transform_values do |value|
108
+ deserialize_entry(value, raw: false)
109
+ end
110
+ end
111
+ end
112
+ end
113
+
114
+ def delete_hash_entries(prefix)
115
+ redis.with { |c| c.del(prefix) }
116
+ end
117
+ end
118
+ end
119
+ end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "active_support"
4
+ require "redis"
5
+ require "redis-activesupport"
6
+
7
+ require "active_support/cache/redis_hash_store"
8
+
9
+ module RedisHashStore
10
+ mattr_accessor :logger, :cache
11
+ end
metadata ADDED
@@ -0,0 +1,214 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: redis_hash_store
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Alex Golubenko
8
+ - Omar Bahareth
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2021-06-03 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: appraisal
16
+ requirement: !ruby/object:Gem::Requirement
17
+ requirements:
18
+ - - ">="
19
+ - !ruby/object:Gem::Version
20
+ version: '0'
21
+ type: :development
22
+ prerelease: false
23
+ version_requirements: !ruby/object:Gem::Requirement
24
+ requirements:
25
+ - - ">="
26
+ - !ruby/object:Gem::Version
27
+ version: '0'
28
+ - !ruby/object:Gem::Dependency
29
+ name: rake
30
+ requirement: !ruby/object:Gem::Requirement
31
+ requirements:
32
+ - - "~>"
33
+ - !ruby/object:Gem::Version
34
+ version: 12.3.2
35
+ type: :development
36
+ prerelease: false
37
+ version_requirements: !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - "~>"
40
+ - !ruby/object:Gem::Version
41
+ version: 12.3.2
42
+ - !ruby/object:Gem::Dependency
43
+ name: rspec
44
+ requirement: !ruby/object:Gem::Requirement
45
+ requirements:
46
+ - - "~>"
47
+ - !ruby/object:Gem::Version
48
+ version: '3.0'
49
+ type: :development
50
+ prerelease: false
51
+ version_requirements: !ruby/object:Gem::Requirement
52
+ requirements:
53
+ - - "~>"
54
+ - !ruby/object:Gem::Version
55
+ version: '3.0'
56
+ - !ruby/object:Gem::Dependency
57
+ name: rubocop
58
+ requirement: !ruby/object:Gem::Requirement
59
+ requirements:
60
+ - - ">="
61
+ - !ruby/object:Gem::Version
62
+ version: '0'
63
+ type: :development
64
+ prerelease: false
65
+ version_requirements: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - ">="
68
+ - !ruby/object:Gem::Version
69
+ version: '0'
70
+ - !ruby/object:Gem::Dependency
71
+ name: rubocop-performance
72
+ requirement: !ruby/object:Gem::Requirement
73
+ requirements:
74
+ - - ">="
75
+ - !ruby/object:Gem::Version
76
+ version: '0'
77
+ type: :development
78
+ prerelease: false
79
+ version_requirements: !ruby/object:Gem::Requirement
80
+ requirements:
81
+ - - ">="
82
+ - !ruby/object:Gem::Version
83
+ version: '0'
84
+ - !ruby/object:Gem::Dependency
85
+ name: rubocop-rails
86
+ requirement: !ruby/object:Gem::Requirement
87
+ requirements:
88
+ - - ">="
89
+ - !ruby/object:Gem::Version
90
+ version: '0'
91
+ type: :development
92
+ prerelease: false
93
+ version_requirements: !ruby/object:Gem::Requirement
94
+ requirements:
95
+ - - ">="
96
+ - !ruby/object:Gem::Version
97
+ version: '0'
98
+ - !ruby/object:Gem::Dependency
99
+ name: rubocop-rspec
100
+ requirement: !ruby/object:Gem::Requirement
101
+ requirements:
102
+ - - ">="
103
+ - !ruby/object:Gem::Version
104
+ version: '0'
105
+ type: :development
106
+ prerelease: false
107
+ version_requirements: !ruby/object:Gem::Requirement
108
+ requirements:
109
+ - - ">="
110
+ - !ruby/object:Gem::Version
111
+ version: '0'
112
+ - !ruby/object:Gem::Dependency
113
+ name: activesupport
114
+ requirement: !ruby/object:Gem::Requirement
115
+ requirements:
116
+ - - ">="
117
+ - !ruby/object:Gem::Version
118
+ version: '0'
119
+ type: :runtime
120
+ prerelease: false
121
+ version_requirements: !ruby/object:Gem::Requirement
122
+ requirements:
123
+ - - ">="
124
+ - !ruby/object:Gem::Version
125
+ version: '0'
126
+ - !ruby/object:Gem::Dependency
127
+ name: railties
128
+ requirement: !ruby/object:Gem::Requirement
129
+ requirements:
130
+ - - ">="
131
+ - !ruby/object:Gem::Version
132
+ version: '0'
133
+ type: :runtime
134
+ prerelease: false
135
+ version_requirements: !ruby/object:Gem::Requirement
136
+ requirements:
137
+ - - ">="
138
+ - !ruby/object:Gem::Version
139
+ version: '0'
140
+ - !ruby/object:Gem::Dependency
141
+ name: redis
142
+ requirement: !ruby/object:Gem::Requirement
143
+ requirements:
144
+ - - ">="
145
+ - !ruby/object:Gem::Version
146
+ version: '0'
147
+ type: :runtime
148
+ prerelease: false
149
+ version_requirements: !ruby/object:Gem::Requirement
150
+ requirements:
151
+ - - ">="
152
+ - !ruby/object:Gem::Version
153
+ version: '0'
154
+ - !ruby/object:Gem::Dependency
155
+ name: redis-rails
156
+ requirement: !ruby/object:Gem::Requirement
157
+ requirements:
158
+ - - ">="
159
+ - !ruby/object:Gem::Version
160
+ version: '0'
161
+ type: :runtime
162
+ prerelease: false
163
+ version_requirements: !ruby/object:Gem::Requirement
164
+ requirements:
165
+ - - ">="
166
+ - !ruby/object:Gem::Version
167
+ version: '0'
168
+ - !ruby/object:Gem::Dependency
169
+ name: redis-store
170
+ requirement: !ruby/object:Gem::Requirement
171
+ requirements:
172
+ - - ">="
173
+ - !ruby/object:Gem::Version
174
+ version: '0'
175
+ type: :runtime
176
+ prerelease: false
177
+ version_requirements: !ruby/object:Gem::Requirement
178
+ requirements:
179
+ - - ">="
180
+ - !ruby/object:Gem::Version
181
+ version: '0'
182
+ description: An addition to Rails's redis_cache_store to allow youto easily use Redis
183
+ hashes for caching
184
+ email: sub@mrsool.co
185
+ executables: []
186
+ extensions: []
187
+ extra_rdoc_files: []
188
+ files:
189
+ - lib/active_support/cache/redis_hash_store.rb
190
+ - lib/redis_hash_store.rb
191
+ homepage: https://github.com/mrsool/redis_hash_store
192
+ licenses:
193
+ - MIT
194
+ metadata: {}
195
+ post_install_message:
196
+ rdoc_options: []
197
+ require_paths:
198
+ - lib
199
+ required_ruby_version: !ruby/object:Gem::Requirement
200
+ requirements:
201
+ - - ">="
202
+ - !ruby/object:Gem::Version
203
+ version: '0'
204
+ required_rubygems_version: !ruby/object:Gem::Requirement
205
+ requirements:
206
+ - - ">="
207
+ - !ruby/object:Gem::Version
208
+ version: '0'
209
+ requirements: []
210
+ rubygems_version: 3.1.2
211
+ signing_key:
212
+ specification_version: 4
213
+ summary: Redis Hash Store
214
+ test_files: []