redis-unique-queue 0.0.8 → 0.0.9

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 9845fcfe3f9ba30fe729fd34c6586e4a4d09a701
4
- data.tar.gz: 901c5b2050de013e41b84712b4d32bc751072645
3
+ metadata.gz: 9988ab673216ddbe91cfb262cfadfc946de64eb6
4
+ data.tar.gz: 4843b3685e9c9b763a2647cf8d042778459cb45d
5
5
  SHA512:
6
- metadata.gz: 5730faf51a240e88214af1e81b74365921b300313e666641b05f0e959aedc00977b7a60b3465f2883e1aacf733461bd674ac061de91020bc09688adf8dedca77
7
- data.tar.gz: 90a24acb69241345577487fe91970d5aa30e66df82e58b35f9fa3923776fddc3e214a9796cc0d121016e95df9edd89039c78ae46560e7ad16c026a094de05d08
6
+ metadata.gz: c07a0e7e00592d7f2a43bcdefca9670a5cd2b9192b8156ed2a3f5e91676ed8966f947412c108de6b34b637a8d960355278e58a0b59361928a2e925b139af7435
7
+ data.tar.gz: 0c72f835e333b462a13fb84390d1597d071884788d77e233739e4f903b2478e45442981fe14c9ae8fc6213653f29be9702660617f3a6f6d707457d17e53d3190
data/README.md CHANGED
@@ -53,6 +53,12 @@ You can pop data from the queue.
53
53
  result = q.pop
54
54
  ```
55
55
 
56
+ You can atomically pop multiple items from the queue.
57
+
58
+ ```ruby
59
+ result = q.pop_multi 3
60
+ ```
61
+
56
62
  You can also pop all items in the queue in one op.
57
63
 
58
64
  ```
@@ -5,7 +5,7 @@ class Redis
5
5
  class Queue
6
6
  attr_reader :name
7
7
 
8
- VERSION = "0.0.8"
8
+ VERSION = "0.0.9"
9
9
 
10
10
  def initialize(name, redis_or_options = {})
11
11
  @name = name
@@ -23,17 +23,15 @@ class Redis
23
23
  end
24
24
 
25
25
  def pop
26
- begin
27
- success, result = attempt_atomic_pop
28
- end while !success && result
29
- result
26
+ block_on_atomic_attempt{ attempt_atomic_pop }
30
27
  end
31
28
 
32
29
  def pop_all
33
- begin
34
- success, result = attempt_atomic_pop_all
35
- end while !success && result
36
- result
30
+ block_on_atomic_attempt{ attempt_atomic_pop_all }
31
+ end
32
+
33
+ def pop_multi amount
34
+ block_on_atomic_attempt{ attempt_atomic_pop_multi amount }
37
35
  end
38
36
 
39
37
  def front
@@ -66,6 +64,7 @@ class Redis
66
64
 
67
65
  def clear
68
66
  @redis.del name
67
+ []
69
68
  end
70
69
 
71
70
  def expire seconds
@@ -74,30 +73,44 @@ class Redis
74
73
 
75
74
  private
76
75
 
77
- def attempt_atomic_pop_all
78
- result = nil
79
- success = @redis.watch(name) do
80
- result = all
81
- if result
82
- @redis.multi do |multi|
83
- multi.del name
84
- end
85
- end
86
- end
76
+ def attempt_atomic_pop_multi amount
77
+ attempt_atomic_read_write lambda{ peek 0, amount }, lambda{ |multi, read_result| multi.zremrangebyrank name, 0, amount - 1 }
78
+ end
87
79
 
88
- [success, result]
80
+ def attempt_atomic_pop_all
81
+ attempt_atomic_read_write lambda{ all }, lambda{ |multi, read_result| multi.del name}
89
82
  end
90
83
 
91
84
  def attempt_atomic_pop
92
85
  min_score = 0
93
86
  max_score = Time.now.to_f
94
87
 
88
+ read = lambda do
89
+ @redis.zrangebyscore(name, min_score, max_score, :with_scores => false, :limit => [0, 1]).first
90
+ end
91
+
92
+ write = lambda do |multi, read_result|
93
+ multi.zrem name, read_result
94
+ end
95
+
96
+ attempt_atomic_read_write read, write
97
+ end
98
+
99
+ def block_on_atomic_attempt
100
+ begin
101
+ success, result = yield
102
+ end while !success && result
103
+ result
104
+ end
105
+
106
+ def attempt_atomic_read_write read_op, write_op
107
+
95
108
  result = nil
96
109
  success = @redis.watch(name) do
97
- result = @redis.zrangebyscore(name, min_score, max_score, :with_scores => false, :limit => [0, 1]).first
110
+ result = read_op.call
98
111
  if result
99
112
  @redis.multi do |multi|
100
- multi.zrem name, result
113
+ write_op.call multi, result
101
114
  end
102
115
  end
103
116
  end
@@ -19,6 +19,6 @@ Gem::Specification.new do |spec|
19
19
  spec.require_paths = ["lib"]
20
20
 
21
21
  spec.add_development_dependency "bundler", "~> 1.5"
22
- spec.add_development_dependency "rake"
23
- spec.add_runtime_dependency 'redis'
22
+ spec.add_development_dependency "rake", '~> 0'
23
+ spec.add_runtime_dependency 'redis', '~> 0'
24
24
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: redis-unique-queue
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.8
4
+ version: 0.0.9
5
5
  platform: ruby
6
6
  authors:
7
7
  - Misha Conway
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-08-25 00:00:00.000000000 Z
11
+ date: 2015-09-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -28,28 +28,28 @@ dependencies:
28
28
  name: rake
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - ">="
31
+ - - "~>"
32
32
  - !ruby/object:Gem::Version
33
33
  version: '0'
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - ">="
38
+ - - "~>"
39
39
  - !ruby/object:Gem::Version
40
40
  version: '0'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: redis
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - ">="
45
+ - - "~>"
46
46
  - !ruby/object:Gem::Version
47
47
  version: '0'
48
48
  type: :runtime
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - ">="
52
+ - - "~>"
53
53
  - !ruby/object:Gem::Version
54
54
  version: '0'
55
55
  description: A unique queue with atomic operations implemented in Redis.