redis_queue 0.1

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
+ SHA1:
3
+ metadata.gz: f4f72acc7eb8f9da95bb6a42b1a1736b7f7363bc
4
+ data.tar.gz: 391941520d6adc380e7e9bfb71cbf1d35ff0f6a4
5
+ SHA512:
6
+ metadata.gz: 42c3df90c0d601a5d761e54a00f05359ceaf74d856bbd7664c6f30c7246a6ef638cfe9629186b2af594004b93cd3d36ee2574156241ee966a58d4f023c94e916
7
+ data.tar.gz: 2065c90f9ac1b3f0c8763f20bf90dbbc8075c3df184659593d8d5e4512a2751ee300515e5d9a7bf898205798b6a8586a065d224b2308674aa96e0a8dc8524b1a
@@ -0,0 +1,25 @@
1
+ require 'redis'
2
+
3
+ class RedisConnection
4
+ def initialize url
5
+ @url = url
6
+ end
7
+
8
+ def run
9
+ @redis ||= new_redis
10
+
11
+ begin
12
+ yield(@redis)
13
+ rescue Redis::CannotConnectError, Redis::TimeoutError => e
14
+ puts e.backtrace
15
+ puts "Redis crashed, retrying"
16
+ sleep 5
17
+ @redis = new_redis
18
+ retry
19
+ end
20
+ end
21
+
22
+ def new_redis
23
+ ::Redis.connect(url: @url)
24
+ end
25
+ end
@@ -0,0 +1,111 @@
1
+ require_relative 'redis_connection'
2
+
3
+ class RedisQueue
4
+ def initialize id=:messages, url='redis://localhost:6379/0'
5
+ @id = id
6
+ @redis_connection = RedisConnection.new(url)
7
+ end
8
+
9
+ def pop
10
+ @redis_connection.run do |redis|
11
+ redis.blpop(@id).last.tap { |msg| redis.sadd "#{@id}_in_use", msg }
12
+ end
13
+ end
14
+
15
+ def push task
16
+ @redis_connection.run { |redis| redis.rpush @id, task }
17
+ end
18
+
19
+ def fail task
20
+ @redis_connection.run do |redis|
21
+ redis.pipelined do
22
+ redis.sadd "#{@id}_failed", task
23
+ redis.srem "#{@id}_in_use", task
24
+ end
25
+ end
26
+ end
27
+
28
+ def done task
29
+ @redis_connection.run do |redis|
30
+ redis.pipelined do
31
+ redis.sadd "#{@id}_done", task
32
+ redis.srem "#{@id}_in_use", task
33
+ end
34
+ end
35
+ end
36
+
37
+ def unpop task
38
+ @redis_connection.run do |redis|
39
+ redis.pipelined do
40
+ redis.lpush @id, task
41
+ redis.srem "#{@id}_in_use", task
42
+ end
43
+ end
44
+ end
45
+
46
+ def reset
47
+ init_from "#{@id}_in_use"
48
+ @redis_connection.run { |redis| redis.del "#{@id}_in_use" }
49
+ end
50
+
51
+ def init_from set
52
+ @redis_connection.run do |redis|
53
+ redis.rpush @id, redis.smembers(set)
54
+ end
55
+ end
56
+
57
+ def size
58
+ @redis_connection.run { |redis| redis.llen @id }.to_i
59
+ end
60
+
61
+ def done_size
62
+ @redis_connection.run { |redis| redis.scard "#{@id}_done" }.to_i
63
+ end
64
+
65
+ def failed_size
66
+ @redis_connection.run { |redis| redis.scard "#{@id}_failed" }.to_i
67
+ end
68
+
69
+ def in_use_size
70
+ @redis_connection.run { |redis| redis.scard "#{@id}_in_use" }.to_i
71
+ end
72
+
73
+ def list
74
+ @redis_connection.run { |redis| redis.lrange @id, 0, -1 }
75
+ end
76
+
77
+ def done_list
78
+ @redis_connection.run { |redis| redis.smembers "#{@id}_done" }
79
+ end
80
+
81
+ def failed_list
82
+ @redis_connection.run { |redis| redis.smembers "#{@id}_failed" }
83
+ end
84
+
85
+ def in_use_list
86
+ @redis_connection.run { |redis| redis.smembers "#{@id}_in_use" }
87
+ end
88
+
89
+ def print_stats
90
+ puts "#{@id} enqueued: #{size}"
91
+ puts "#{@id} in use: #{in_use_size}"
92
+ puts "#{@id} failed: #{failed_size}"
93
+ puts "#{@id} done: #{done_size}"
94
+ end
95
+
96
+ def print_contents
97
+ puts "#{@id} enqueued: #{list}"
98
+ puts "#{@id} in use: #{in_use_list}"
99
+ puts "#{@id} failed: #{failed_list}"
100
+ puts "#{@id} done: #{done_list}"
101
+ end
102
+
103
+ def clear
104
+ @redis_connection.run do |redis|
105
+ redis.del @id
106
+ redis.del "#{@id}_in_use"
107
+ redis.del "#{@id}_done"
108
+ redis.del "#{@id}_failed"
109
+ end
110
+ end
111
+ end
metadata ADDED
@@ -0,0 +1,59 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: redis_queue
3
+ version: !ruby/object:Gem::Version
4
+ version: '0.1'
5
+ platform: ruby
6
+ authors:
7
+ - Jose Ignacio Fernandez
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-02-02 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: redis
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - '>='
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - '>='
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ description: A redis-based queue
28
+ email: joseignacio.fernandez@gmail.com
29
+ executables: []
30
+ extensions: []
31
+ extra_rdoc_files: []
32
+ files:
33
+ - lib/redis_queue.rb
34
+ - lib/redis_connection.rb
35
+ homepage: http://github.com/josei/redis_queue
36
+ licenses:
37
+ - MIT
38
+ metadata: {}
39
+ post_install_message:
40
+ rdoc_options: []
41
+ require_paths:
42
+ - lib
43
+ required_ruby_version: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - '>='
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ required_rubygems_version: !ruby/object:Gem::Requirement
49
+ requirements:
50
+ - - '>='
51
+ - !ruby/object:Gem::Version
52
+ version: '0'
53
+ requirements: []
54
+ rubyforge_project:
55
+ rubygems_version: 2.0.3
56
+ signing_key:
57
+ specification_version: 4
58
+ summary: Redis Queue
59
+ test_files: []