redis_queue 0.7.0 → 0.8.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (3) hide show
  1. checksums.yaml +4 -4
  2. data/lib/redis_queue.rb +39 -32
  3. metadata +1 -1
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 478d7768be5fbb3a39f9b578d1a0398f221e4dfa
4
- data.tar.gz: d818a1f802cb83ff38f1a639bd8011dc0dedab7d
3
+ metadata.gz: f49c187b5bb4deb1ca5849534ff7ee9760bc2fcd
4
+ data.tar.gz: 10468e1f322dc6a4e68fc5f385ed04c79d28829c
5
5
  SHA512:
6
- metadata.gz: f1be4795444eb4700248dded81c56c880cba7cb1490149acbf73913df7890331ad469274a192583f0f5255c5227ba0228862ed2d1015d32b79f680e020051706
7
- data.tar.gz: 6a6c522e9b3542eff0dd875ff83567294795f69f6645a4e35a5fb5bb1d122c01fadfd3e1beb0e3040b0646e4b8232ba33c4b704f7b16d9969c700ec0d239c1b8
6
+ metadata.gz: ce68bfda0e8abdbd3a5b189f47d0496004808e1be7f320349127fc6ff749a0cb66d25d75f0537b8158a6dfaf3e7a1aa8157747f26bc4542afbf0a4bc3c8aa5a2
7
+ data.tar.gz: 9ee5a1184dacaa73a10906aa03587a6a37eb50599c5e6a56a1d9ecea72fafe7d15c3c2b2a445b40924fb3c06c6c6eb07ad94d95f5cac9c5e12b67c142ea6113a
data/lib/redis_queue.rb CHANGED
@@ -18,7 +18,7 @@ class RedisQueue
18
18
  message = redis.call('lpop', ARGV[1])
19
19
  end
20
20
  if message then
21
- redis.call('sadd', ARGV[1]..'_in_use', message)
21
+ redis.call('hset', ARGV[1]..'_in_use', message, ARGV[2])
22
22
  end
23
23
  return message
24
24
  "'',
@@ -34,25 +34,30 @@ class RedisQueue
34
34
  "'',
35
35
  repush: ''"
36
36
  #{PUSH_CODE}
37
- redis.call('srem', ARGV[1]..'_in_use', ARGV[2])
37
+ redis.call('hdel', ARGV[1]..'_in_use', ARGV[2])
38
38
  "'',
39
39
  fail: ''"
40
- redis.call('sadd', ARGV[1]..'_failed', ARGV[2])
41
- redis.call('srem', ARGV[1]..'_in_use', ARGV[2])
40
+ redis.call('hset', ARGV[1]..'_failed', ARGV[2], ARGV[3])
41
+ redis.call('hdel', ARGV[1]..'_in_use', ARGV[2])
42
42
  "'',
43
43
  done: ''"
44
- redis.call('sadd', ARGV[1]..'_done', ARGV[2])
45
- redis.call('srem', ARGV[1]..'_in_use', ARGV[2])
44
+ redis.call('hset', ARGV[1]..'_done', ARGV[2], ARGV[3])
45
+ redis.call('hdel', ARGV[1]..'_in_use', ARGV[2])
46
46
  "'',
47
47
  unpop: ''"
48
48
  redis.call('lpush', ARGV[1], ARGV[2])
49
- redis.call('srem', ARGV[1]..'_in_use', ARGV[2])
49
+ redis.call('hdel', ARGV[1]..'_in_use', ARGV[2])
50
50
  "'',
51
51
  init_from: ''"
52
- local vals = redis.call('smembers', ARGV[2])
52
+ local vals = redis.call('hkeys', ARGV[2])
53
53
  for i = 1, table.getn(vals) do
54
- redis.call('lpush', ARGV[1], vals[i])
55
- end"''
54
+ local timestamp = redis.call('hget', ARGV[2], vals[i])
55
+ if timestamp < ARGV[3] then
56
+ redis.call('lpush', ARGV[1], vals[i])
57
+ redis.call('hdel', ARGV[2], vals[i])
58
+ end
59
+ end
60
+ "''
56
61
  }.freeze
57
62
 
58
63
  def initialize(args = {})
@@ -66,7 +71,7 @@ class RedisQueue
66
71
  def pop(block: true)
67
72
  return nonblpop unless block
68
73
  message = blpop
69
- @redis.run { |redis| redis.sadd "#{@id}_in_use", message } if message
74
+ @redis.run { |redis| redis.hset "#{@id}_in_use", message, now } if message
70
75
  message
71
76
  end
72
77
 
@@ -75,11 +80,11 @@ class RedisQueue
75
80
  end
76
81
 
77
82
  def fail(message)
78
- script :fail, @id, message
83
+ script :fail, @id, message, now
79
84
  end
80
85
 
81
86
  def done(message)
82
- script :done, @id, message
87
+ script :done, @id, message, now
83
88
  end
84
89
 
85
90
  def unpop(message)
@@ -91,7 +96,7 @@ class RedisQueue
91
96
  end
92
97
 
93
98
  def forget(message)
94
- @redis.run { |redis| redis.srem "#{@id}_in_use", message }
99
+ @redis.run { |redis| redis.hdel "#{@id}_in_use", message }
95
100
  end
96
101
 
97
102
  def remove(message)
@@ -105,18 +110,12 @@ class RedisQueue
105
110
  message
106
111
  end
107
112
 
108
- def reset
109
- init_from "#{@id}_in_use"
110
- @redis.run { |redis| redis.del "#{@id}_in_use" }
113
+ def reset(older_than: nil)
114
+ init_from "#{@id}_in_use", older_than
111
115
  end
112
116
 
113
117
  def restart
114
118
  init_from "#{@id}_done"
115
- @redis.run { |redis| redis.del "#{@id}_done" }
116
- end
117
-
118
- def init_from(set)
119
- script(:init_from, @id, set)
120
119
  end
121
120
 
122
121
  def size
@@ -124,15 +123,15 @@ class RedisQueue
124
123
  end
125
124
 
126
125
  def done_size
127
- @redis.run { |redis| redis.scard "#{@id}_done" }.to_i
126
+ @redis.run { |redis| redis.hlen "#{@id}_done" }.to_i
128
127
  end
129
128
 
130
129
  def failed_size
131
- @redis.run { |redis| redis.scard "#{@id}_failed" }.to_i
130
+ @redis.run { |redis| redis.hlen "#{@id}_failed" }.to_i
132
131
  end
133
132
 
134
133
  def in_use_size
135
- @redis.run { |redis| redis.scard "#{@id}_in_use" }.to_i
134
+ @redis.run { |redis| redis.hlen "#{@id}_in_use" }.to_i
136
135
  end
137
136
 
138
137
  def list
@@ -140,15 +139,15 @@ class RedisQueue
140
139
  end
141
140
 
142
141
  def done_list
143
- @redis.run { |redis| redis.smembers "#{@id}_done" }
142
+ Hash[@redis.run { |redis| redis.hgetall "#{@id}_done" }]
144
143
  end
145
144
 
146
145
  def failed_list
147
- @redis.run { |redis| redis.smembers "#{@id}_failed" }
146
+ Hash[@redis.run { |redis| redis.hgetall "#{@id}_failed" }]
148
147
  end
149
148
 
150
149
  def in_use_list
151
- @redis.run { |redis| redis.smembers "#{@id}_in_use" }
150
+ Hash[@redis.run { |redis| redis.hgetall "#{@id}_in_use" }]
152
151
  end
153
152
 
154
153
  def print_stats
@@ -177,20 +176,24 @@ class RedisQueue
177
176
  private
178
177
 
179
178
  def blpop
180
- begin
179
+ loop do
181
180
  message = @redis_blocking.run { |redis| redis.blpop(@id) }.last
182
- end while message == ''
183
- message
181
+ return message unless message == ''
182
+ end
184
183
  end
185
184
 
186
185
  def nonblpop
187
- script :nonblpop, @id
186
+ script :nonblpop, @id, now
188
187
  end
189
188
 
190
189
  def nonbltouch
191
190
  script :touch, @id
192
191
  end
193
192
 
193
+ def init_from(key, older_than = nil)
194
+ script(:init_from, @id, key, older_than || now + 100_000)
195
+ end
196
+
194
197
  def load_scripts
195
198
  @scripts = {}
196
199
  @redis.run do |redis|
@@ -203,6 +206,10 @@ class RedisQueue
203
206
  def script(name, *args)
204
207
  @redis.run { |redis| redis.evalsha @scripts[name], argv: args }
205
208
  end
209
+
210
+ def now
211
+ (Time.now.to_f * 1000).to_i
212
+ end
206
213
  end
207
214
 
208
215
  require_relative 'redis_connection'
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: redis_queue
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.7.0
4
+ version: 0.8.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jose Ignacio Fernandez