redis_queue 0.1

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 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: []