redis_queue 0.2.2 → 0.3
Sign up to get free protection for your applications and to get access to all the features.
- 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
|