redis-unique-queue 1.0.2 → 1.0.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (3) hide show
  1. checksums.yaml +4 -4
  2. data/lib/redis/unique/queue.rb +26 -18
  3. metadata +3 -3
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 45c090903b2f0f09a20393a18c1df70b7c6e6378
4
- data.tar.gz: ad9e42c94f1ee0a273c9d2fadc6fcb55f4d9f7f8
3
+ metadata.gz: 79dd06e09747ec1015a14103fd72c6e19a121b1c
4
+ data.tar.gz: 5851bf6cd8e38b65915bc6c449796959c2600c5a
5
5
  SHA512:
6
- metadata.gz: bcf14202e74611adfd7c51ccf176d78f0391d2f9ddad85ae1918d47071f1606bb02944f9d46c67f266d9251dff73072cdf2c39c22d47e5e240c3966b2f48bd64
7
- data.tar.gz: 349bd063035ff95d8d34b67f9218068eb2238aa49971bbde852ed73013ada6ab28af9f4711eeff8d816f4f63a30229898df48e579b78ee32bbe812ce8d2cbf79
6
+ metadata.gz: b202259ac4ef6ba1bea1b0785d2e40bc519c3aa9d7731b9fe1a1ae2df7ee6f07a4446cec41cbd04170d139059f4df5fab6489e69b48d19f9cd112002349aeea3
7
+ data.tar.gz: 9f8ae2edf1e423b50a4e159108d560f069abb2961fe6c8047b761b8ab6766526c2dfe828497979142197cb2a25c569175fa0dc740f04d2a73d76866b15f963fa
@@ -5,14 +5,14 @@ class Redis
5
5
  class Queue
6
6
  attr_reader :name
7
7
 
8
- VERSION = "1.0.2"
8
+ VERSION = "1.0.3"
9
9
 
10
10
  class InvalidNameException < StandardError; end;
11
11
  class InvalidRedisConfigException < StandardError; end;
12
12
 
13
13
  def initialize(name, redis_or_options = {})
14
14
  name = name.to_s if name.kind_of? Symbol
15
-
15
+
16
16
  raise InvalidNameException.new unless name.kind_of?(String) && name.size > 0
17
17
  @name = name
18
18
  @redis = if redis_or_options.kind_of? Redis
@@ -25,21 +25,12 @@ class Redis
25
25
  end
26
26
 
27
27
  def push data
28
- score = Time.now.to_f
29
- @redis.zadd(name, score, data)
28
+ [block_on_atomic_attempt{ attempt_atomic_push_multi(data) }].flatten.first
30
29
  end
31
30
 
32
31
  def push_multi *values
33
32
  if values.size > 0
34
- score = Time.now.to_f
35
-
36
- values = values.first if 1 == values.size && values.first.kind_of?(Array)
37
- scored_values = []
38
- values.each_with_index do |value, i|
39
- scored_values << [score + i, value]
40
- end
41
-
42
- @redis.zadd name, scored_values
33
+ block_on_atomic_attempt{ attempt_atomic_push_multi(*values) }
43
34
  end
44
35
  end
45
36
 
@@ -97,7 +88,27 @@ class Redis
97
88
  end
98
89
 
99
90
  private
100
-
91
+
92
+ def max_score
93
+ @redis.zscore name, back
94
+ end
95
+
96
+ def attempt_atomic_push_multi *values
97
+ success = @redis.watch(name) do
98
+ score = [Time.now.to_f, max_score].compact.max
99
+ values = values.first if 1 == values.size && values.first.kind_of?(Array)
100
+ scored_values = []
101
+ values.each_with_index do |value, i|
102
+ scored_values << [score + i, value]
103
+ end
104
+ @redis.multi do |multi|
105
+ multi.zadd name, scored_values
106
+ end
107
+ end
108
+
109
+ [success, values]
110
+ end
111
+
101
112
  def attempt_atomic_pop_multi amount
102
113
  attempt_atomic_read_write lambda{ peek 0, amount }, lambda{ |multi, read_result| multi.zremrangebyrank name, 0, amount - 1 }
103
114
  end
@@ -107,11 +118,8 @@ class Redis
107
118
  end
108
119
 
109
120
  def attempt_atomic_pop
110
- min_score = 0
111
- max_score = Time.now.to_f
112
-
113
121
  read = lambda do
114
- @redis.zrangebyscore(name, min_score, max_score, :with_scores => false, :limit => [0, 1]).first
122
+ @redis.zrangebyscore(name, 0, max_score, :with_scores => false, :limit => [0, 1]).first
115
123
  end
116
124
 
117
125
  write = lambda do |multi, read_result|
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: 1.0.2
4
+ version: 1.0.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Misha Conway
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-01-19 00:00:00.000000000 Z
11
+ date: 2017-06-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -86,7 +86,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
86
86
  version: '0'
87
87
  requirements: []
88
88
  rubyforge_project:
89
- rubygems_version: 2.6.7
89
+ rubygems_version: 2.6.12
90
90
  signing_key:
91
91
  specification_version: 4
92
92
  summary: A unique queue with atomic operations implemented in Redis