redis_queue 0.2.2 → 0.3
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.
- checksums.yaml +4 -4
- data/lib/redis_queue.rb +43 -21
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 14ecb40d446afdf9a51b35bba011c7b624b564da
|
4
|
+
data.tar.gz: 165266f148f89bb86f186ee5b1ea1a3d12519f3b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 27ee2b2f69ac03bccc97ebaa87feb1f7f7224dd56261ef7c2167ca467d152d7215925633302158e9716cb0cb7296944051970b25f402855c3aaa24c3c8f225e7
|
7
|
+
data.tar.gz: c2399835758c0c4ffb8ab54f57dfd0a51216a2c4402622db938e9932ca6e3013b0cb61c5cef9c0442580d5d16a905f26ff5f2a3c3fdb34dedc75e4639a8518ab
|
data/lib/redis_queue.rb
CHANGED
@@ -1,16 +1,37 @@
|
|
1
1
|
require_relative 'redis_connection'
|
2
2
|
|
3
3
|
class RedisQueue
|
4
|
+
SCRIPTS = {
|
5
|
+
fail: """
|
6
|
+
redis.call('sadd', ARGV[1]..'_failed', ARGV[2])
|
7
|
+
redis.call('srem', ARGV[1]..'_in_use', ARGV[2])
|
8
|
+
""",
|
9
|
+
done: """
|
10
|
+
redis.call('sadd', ARGV[1]..'_done', ARGV[2])
|
11
|
+
redis.call('srem', ARGV[1]..'_in_use', ARGV[2])
|
12
|
+
""",
|
13
|
+
unpop: """
|
14
|
+
redis.call('lpush', ARGV[1], ARGV[2])
|
15
|
+
redis.call('srem', ARGV[1]..'_in_use', ARGV[2])
|
16
|
+
""",
|
17
|
+
init_from: """
|
18
|
+
local vals = redis.call('smembers', ARGV[2])
|
19
|
+
for i = 1, table.getn(vals) do
|
20
|
+
redis.call('rpush', ARGV[1], vals[i])
|
21
|
+
end"""
|
22
|
+
}
|
23
|
+
|
4
24
|
def initialize args={id: :messages, url: 'redis://localhost:6379/0'}
|
5
25
|
@id = args.delete(:id)
|
6
26
|
@redis = RedisConnection.new(args)
|
7
27
|
@redis_blocking = RedisConnection.new(args)
|
28
|
+
load_scripts
|
8
29
|
end
|
9
30
|
|
10
31
|
def pop
|
11
|
-
|
12
|
-
@redis.run { |redis| redis.sadd "#{@id}_in_use",
|
13
|
-
|
32
|
+
task = @redis_blocking.run { |redis| redis.blpop(@id) }.last
|
33
|
+
@redis.run { |redis| redis.sadd "#{@id}_in_use", task }
|
34
|
+
task
|
14
35
|
end
|
15
36
|
|
16
37
|
def push task
|
@@ -18,24 +39,15 @@ class RedisQueue
|
|
18
39
|
end
|
19
40
|
|
20
41
|
def fail task
|
21
|
-
@
|
22
|
-
redis.sadd "#{@id}_failed", task
|
23
|
-
redis.srem "#{@id}_in_use", task
|
24
|
-
end
|
42
|
+
script :fail, @id, task
|
25
43
|
end
|
26
44
|
|
27
45
|
def done task
|
28
|
-
@
|
29
|
-
redis.sadd "#{@id}_done", task
|
30
|
-
redis.srem "#{@id}_in_use", task
|
31
|
-
end
|
46
|
+
script :done, @id, task
|
32
47
|
end
|
33
48
|
|
34
49
|
def unpop task
|
35
|
-
@
|
36
|
-
redis.lpush @id, task
|
37
|
-
redis.srem "#{@id}_in_use", task
|
38
|
-
end
|
50
|
+
script :unpop, @id, task
|
39
51
|
end
|
40
52
|
|
41
53
|
def reset
|
@@ -49,12 +61,7 @@ class RedisQueue
|
|
49
61
|
end
|
50
62
|
|
51
63
|
def init_from set
|
52
|
-
@
|
53
|
-
redis.eval "local vals = redis.call('smembers', '#{set}')
|
54
|
-
for i = 1, table.getn(vals) do
|
55
|
-
redis.call('rpush', '#{@id}', vals[i])
|
56
|
-
end"
|
57
|
-
end
|
64
|
+
script(:init_from, @id, set)
|
58
65
|
end
|
59
66
|
|
60
67
|
def size
|
@@ -111,4 +118,19 @@ class RedisQueue
|
|
111
118
|
redis.del "#{@id}_failed"
|
112
119
|
end
|
113
120
|
end
|
121
|
+
|
122
|
+
private
|
123
|
+
|
124
|
+
def load_scripts
|
125
|
+
@scripts = {}
|
126
|
+
@redis.run do |redis|
|
127
|
+
SCRIPTS.each do |name, code|
|
128
|
+
@scripts[name] = redis.script(:load, code)
|
129
|
+
end
|
130
|
+
end
|
131
|
+
end
|
132
|
+
|
133
|
+
def script name, *args
|
134
|
+
@redis.run { |redis| redis.evalsha @scripts[name], argv: args }
|
135
|
+
end
|
114
136
|
end
|