redis-set 0.0.1 → 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- 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
|