redis-set 0.0.1 → 0.0.2
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 +4 -4
- data/README.md +90 -8
- data/lib/redis/set.rb +73 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 85fb6b90aa4d2878c749b147389a183557967f5a
|
4
|
+
data.tar.gz: e6d89f6f66dd79108298f7d97cab63ca8e3a1e22
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 703d725c82cc116107ded6d3174dc2646ab419cbc0c11665523a0386e6688f104854a7c45c8feaaf18e61fdbcaf5a6e8c862ba3605461bb4b86962f0832275c5
|
7
|
+
data.tar.gz: a1ac7949c4cbf73eb0c9bd4f5d1c930e355860d1064a7a8dfd5c2c19d9b4d0cff4f189bc3b0f1b23705a6398fd4899e206c444195db9951d9282c225fbddf56a
|
data/README.md
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# Redis::Set
|
2
2
|
|
3
|
-
|
3
|
+
A unique set of unordered items. Lightweight wrapper over redis sets with some additional enumeration and atomic operations.
|
4
4
|
|
5
5
|
TODO: Delete this and the text above, and describe your gem
|
6
6
|
|
@@ -20,17 +20,99 @@ Or install it yourself as:
|
|
20
20
|
|
21
21
|
$ gem install redis-set
|
22
22
|
|
23
|
-
##
|
23
|
+
## Getting started
|
24
24
|
|
25
|
-
|
25
|
+
```ruby
|
26
|
+
s = Redis::Set.new 'completed_customer_ids'
|
27
|
+
```
|
28
|
+
|
29
|
+
Or you can pass in your own instance of the Redis class.
|
30
|
+
|
31
|
+
```ruby
|
32
|
+
s = Redis::Set.new 'completed_customer_ids', Redis.new(:host => "10.0.1.1", :port => 6380, :db => 15)
|
33
|
+
```
|
34
|
+
|
35
|
+
A third option is to instead pass your Redis configurations.
|
36
|
+
|
37
|
+
```ruby
|
38
|
+
s = Redis::Set.new 'completed_customer_ids', :host => "10.0.1.1", :port => 6380, :db => 15
|
39
|
+
```
|
40
|
+
|
41
|
+
## Using the set
|
42
|
+
|
43
|
+
You can add data to the set using either the add or push methods.
|
44
|
+
|
45
|
+
```ruby
|
46
|
+
s.add "hello"
|
47
|
+
s.add "world"
|
48
|
+
s.add "hello" # the item 'hello' will only exist once in the set since it is unique
|
49
|
+
```
|
26
50
|
|
27
|
-
|
51
|
+
You can insert multiple items set using the add_multi or push_multi methods
|
28
52
|
|
29
|
-
|
53
|
+
```ruby
|
54
|
+
s.add_multi ["one","two","three"]
|
55
|
+
s.add_multi "four","five","six"
|
56
|
+
# set should have items "one","two","three","four","five","six" now
|
57
|
+
```
|
30
58
|
|
31
|
-
|
59
|
+
You can insert a new item into the set and get the resultant size of the set atomically
|
60
|
+
```ruby
|
61
|
+
new_count = s.add_with_count "awesome"
|
62
|
+
```
|
32
63
|
|
33
|
-
|
64
|
+
You can pop a random item from the set
|
65
|
+
```ruby
|
66
|
+
result = s.pop
|
67
|
+
```
|
68
|
+
|
69
|
+
You can pop multiple random items from the set
|
70
|
+
```ruby
|
71
|
+
result = s.pop_multi 5 # pop 5 random items from set and return them
|
72
|
+
```
|
34
73
|
|
35
|
-
|
74
|
+
You can remove a specific item from the set
|
75
|
+
```ruby
|
76
|
+
s.remove 5 #remove the item 5 from the set if it exists
|
77
|
+
```
|
78
|
+
|
79
|
+
You can atomically remove multiple items from the set.
|
80
|
+
|
81
|
+
```ruby
|
82
|
+
s.remove_multi 3,4,5 #removes items 3,4, and 5 from the set if they exist
|
83
|
+
```
|
84
|
+
|
85
|
+
You can get the size of the set.
|
86
|
+
|
87
|
+
```ruby
|
88
|
+
s.size
|
89
|
+
```
|
90
|
+
|
91
|
+
You can see if an item exists in the set.
|
92
|
+
|
93
|
+
```ruby
|
94
|
+
s.include? "hello"
|
95
|
+
```
|
96
|
+
|
97
|
+
You can get all items in the set.
|
98
|
+
|
99
|
+
```ruby
|
100
|
+
s.all
|
101
|
+
```
|
102
|
+
|
103
|
+
The set can be cleared of all items
|
104
|
+
```ruby
|
105
|
+
s.clear
|
106
|
+
```
|
107
|
+
|
108
|
+
The set can also be set to expire (in seconds).
|
109
|
+
```ruby
|
110
|
+
# expire in five minutes
|
111
|
+
s.expire 60*5
|
112
|
+
```
|
113
|
+
|
114
|
+
You can enumerate the set in batches.
|
115
|
+
```ruby
|
116
|
+
s.enumerator(100).each{ |i| puts i } #enumerate through the set in batches of 100 items per redis op
|
117
|
+
```
|
36
118
|
|
data/lib/redis/set.rb
CHANGED
@@ -4,12 +4,14 @@ class Redis
|
|
4
4
|
class Set
|
5
5
|
attr_reader :name
|
6
6
|
|
7
|
-
VERSION = "0.0.
|
7
|
+
VERSION = "0.0.2"
|
8
8
|
|
9
9
|
class InvalidNameException < StandardError; end;
|
10
10
|
class InvalidRedisConfigException < StandardError; end;
|
11
11
|
|
12
12
|
def initialize(name, redis_or_options = {})
|
13
|
+
name = name.to_s if name.kind_of? Symbol
|
14
|
+
|
13
15
|
raise InvalidNameException.new unless name.kind_of?(String) && name.size > 0
|
14
16
|
@name = name
|
15
17
|
@redis = if redis_or_options.kind_of? Redis
|
@@ -25,6 +27,8 @@ class Redis
|
|
25
27
|
@redis.sadd name, value
|
26
28
|
end
|
27
29
|
|
30
|
+
alias push add
|
31
|
+
|
28
32
|
def add_multi *values
|
29
33
|
if values.size > 0
|
30
34
|
values = values.first if 1 == values.size && values.first.kind_of?(Array)
|
@@ -32,6 +36,14 @@ class Redis
|
|
32
36
|
end
|
33
37
|
end
|
34
38
|
|
39
|
+
alias push_multi add_multi
|
40
|
+
|
41
|
+
def add_with_count value
|
42
|
+
block_on_atomic_attempt{ attempt_atomic_add_read_count value }
|
43
|
+
end
|
44
|
+
|
45
|
+
alias push_with_count add_with_count
|
46
|
+
|
35
47
|
def remove value
|
36
48
|
@redis.srem name, value
|
37
49
|
end
|
@@ -43,6 +55,14 @@ class Redis
|
|
43
55
|
end
|
44
56
|
end
|
45
57
|
|
58
|
+
def pop
|
59
|
+
@redis.pop name, 1
|
60
|
+
end
|
61
|
+
|
62
|
+
def pop_multi amount
|
63
|
+
@redis.pop name, amount
|
64
|
+
end
|
65
|
+
|
46
66
|
def include? value
|
47
67
|
@redis.sismember(name, value)
|
48
68
|
end
|
@@ -51,17 +71,69 @@ class Redis
|
|
51
71
|
@redis.scard name
|
52
72
|
end
|
53
73
|
|
74
|
+
alias count size
|
75
|
+
|
54
76
|
def all
|
55
77
|
@redis.smembers name
|
56
78
|
end
|
57
79
|
|
80
|
+
def scan cursor = 0, amount=10, match = "*"
|
81
|
+
@redis.sscan name, cursor, :count => amount, :match => match
|
82
|
+
end
|
83
|
+
|
84
|
+
def enumerator(slice_size = 10)
|
85
|
+
cursor = 0
|
86
|
+
Enumerator.new do |yielder|
|
87
|
+
loop do
|
88
|
+
cursor, items = scan cursor, slice_size
|
89
|
+
items.each do |item|
|
90
|
+
yielder << item
|
91
|
+
end
|
92
|
+
raise StopIteration if cursor.to_i.zero?
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
58
97
|
def clear
|
59
98
|
@redis.del name
|
60
99
|
[]
|
61
100
|
end
|
62
101
|
|
102
|
+
alias flush clear
|
103
|
+
|
63
104
|
def expire seconds
|
64
105
|
@redis.expire name, seconds
|
65
106
|
end
|
107
|
+
|
108
|
+
private
|
109
|
+
|
110
|
+
def attempt_atomic_add_read_count value
|
111
|
+
attempt_atomic_write_read lambda{ add value }, lambda{ |multi, read_result| multi.scard name}
|
112
|
+
end
|
113
|
+
|
114
|
+
def block_on_atomic_attempt
|
115
|
+
begin
|
116
|
+
success, result = yield
|
117
|
+
#puts "success is #{success} and result is #{result}"
|
118
|
+
end while !success && result
|
119
|
+
result.value
|
120
|
+
end
|
121
|
+
|
122
|
+
def attempt_atomic_write_read write_op, read_op
|
123
|
+
|
124
|
+
write_result, read_result = nil, nil
|
125
|
+
success = @redis.watch(name) do
|
126
|
+
write_result = write_op.call
|
127
|
+
#if write_result
|
128
|
+
@redis.multi do |multi|
|
129
|
+
read_result = read_op.call multi, write_result
|
130
|
+
end
|
131
|
+
#end
|
132
|
+
end
|
133
|
+
|
134
|
+
[success, read_result]
|
135
|
+
end
|
136
|
+
|
137
|
+
|
66
138
|
end
|
67
139
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: redis-set
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Misha Conway
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-01-
|
11
|
+
date: 2017-01-20 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|