redis-unique-queue 1.0.2 → 1.0.3

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.
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