lets_shard 0.1.0 → 0.1.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +8 -3
- data/lets_shard.gemspec +1 -0
- data/lib/lets_shard/version.rb +1 -1
- data/lib/lets_shard.rb +16 -5
- metadata +4 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d7ad5ad3bc12b55db4816cd5b729704a502f6365ee135f0bc8b789d9e0aed18b
|
4
|
+
data.tar.gz: 7d08482f4ee12152db3ae2d09ac33400fd748844a34a44fc8aae088e13d63a41
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1b15660bfda65b7d4637c7c1a27f4cdf706318a1228e8693c1fc93c770b5ab84728835c86286e8a645be061eea147120482e87ce777ad9b021d60bdf23112242
|
7
|
+
data.tar.gz: 214e8d1f9b116f9b0fa7305e398ceb384db071692d6da170242fb2278b4735697075f762f870c6909c9473fcc7bdec30f5851c8b164ab5fb03c6b3c9f4b254d8
|
data/README.md
CHANGED
@@ -65,12 +65,12 @@ redis_shards = LetsShard.new([redis1, redis2])
|
|
65
65
|
redis_shards.get_object('key').set('key', 'value')
|
66
66
|
redis_shards.get_object('key').get('key')
|
67
67
|
|
68
|
-
# redis_shards.get_object('key')
|
68
|
+
# redis_shards.get_object('key').any_redis_command
|
69
69
|
```
|
70
70
|
|
71
71
|
### LetsShard let you distribute objects usage better!
|
72
72
|
|
73
|
-
If you are
|
73
|
+
If you are using 3 redis instances in 3 servers, but one of these servers has more
|
74
74
|
powerful specifications than the others and you want to utilize its power.
|
75
75
|
|
76
76
|
**LetsShard** can solve it for you, easily!
|
@@ -86,7 +86,7 @@ redis3 = Redis.new(host: "10.0.0.3", port: 6379)
|
|
86
86
|
redises = [redis1, redis2, redis3]
|
87
87
|
weights = [2, 1, 1] # By default, the weight of each object is 1
|
88
88
|
|
89
|
-
redis_shards = LetsShard.new(redises, weights)
|
89
|
+
redis_shards = LetsShard.new(redises, weights: weights)
|
90
90
|
|
91
91
|
# So now LetsShard will give redis1 more slots to utilize it more!
|
92
92
|
```
|
@@ -99,3 +99,8 @@ Bug reports and pull requests are welcome on GitHub at https://github.com/oshbou
|
|
99
99
|
## Code of Conduct
|
100
100
|
|
101
101
|
Everyone interacting in the LetsShard project's codebases, issue trackers, chat rooms and mailing lists is expected to follow the [code of conduct](https://github.com/[USERNAME]/lets_shard/blob/master/CODE_OF_CONDUCT.md).
|
102
|
+
|
103
|
+
|
104
|
+
## License
|
105
|
+
|
106
|
+
LetsShard is released under the [MIT License](https://opensource.org/licenses/MIT).
|
data/lets_shard.gemspec
CHANGED
@@ -5,6 +5,7 @@ Gem::Specification.new do |spec|
|
|
5
5
|
spec.version = LetsShard::VERSION
|
6
6
|
spec.authors = ['oshboul']
|
7
7
|
spec.email = ['omar.abdula@gmail.com']
|
8
|
+
spec.licenses = ['MIT']
|
8
9
|
|
9
10
|
spec.summary = spec.description = 'An easy way to shard anything!'
|
10
11
|
spec.homepage = 'https://github.com/oshboul/lets_shard'
|
data/lib/lets_shard/version.rb
CHANGED
data/lib/lets_shard.rb
CHANGED
@@ -5,15 +5,17 @@ require 'lets_shard/shard'
|
|
5
5
|
class LetsShard
|
6
6
|
attr_reader :shards
|
7
7
|
|
8
|
-
|
8
|
+
DEFAULT_SLOTS = 16384
|
9
9
|
|
10
|
-
def initialize(objects, weights
|
10
|
+
def initialize(objects, weights: [])
|
11
11
|
validate_parameters!(objects, weights)
|
12
12
|
|
13
13
|
@objects = objects
|
14
14
|
@weights = weights.any? ? weights : Array.new(@objects.size, 1)
|
15
|
+
@slots = @objects.size < DEFAULT_SLOTS ? DEFAULT_SLOTS : @objects.size
|
15
16
|
|
16
17
|
set_unit_weight!
|
18
|
+
set_remainder_slots!
|
17
19
|
generate_shards!
|
18
20
|
end
|
19
21
|
|
@@ -36,7 +38,12 @@ class LetsShard
|
|
36
38
|
start_slot = 0
|
37
39
|
|
38
40
|
@objects.each_with_index do |object, index|
|
39
|
-
end_slot =
|
41
|
+
end_slot = start_slot + (@weights[index] * @unit_weight) - 1
|
42
|
+
|
43
|
+
if @remainder_slots > 0
|
44
|
+
end_slot += 1
|
45
|
+
@remainder_slots -= 1
|
46
|
+
end
|
40
47
|
|
41
48
|
@shards << Shard.new(object, start_slot, end_slot)
|
42
49
|
|
@@ -45,11 +52,15 @@ class LetsShard
|
|
45
52
|
end
|
46
53
|
|
47
54
|
def set_unit_weight!
|
48
|
-
@unit_weight =
|
55
|
+
@unit_weight = @slots / @weights.inject(0, :+)
|
56
|
+
end
|
57
|
+
|
58
|
+
def set_remainder_slots!
|
59
|
+
@remainder_slots = @slots - (@unit_weight * @objects.size)
|
49
60
|
end
|
50
61
|
|
51
62
|
def get_hkey(key)
|
52
|
-
Digest.crc16(key.to_s) %
|
63
|
+
Digest.crc16(key.to_s) % @slots
|
53
64
|
end
|
54
65
|
|
55
66
|
def validate_parameters!(objects, weights)
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: lets_shard
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- oshboul
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-04-
|
11
|
+
date: 2020-04-04 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: An easy way to shard anything!
|
14
14
|
email:
|
@@ -31,7 +31,8 @@ files:
|
|
31
31
|
- lib/lets_shard/shard.rb
|
32
32
|
- lib/lets_shard/version.rb
|
33
33
|
homepage: https://github.com/oshboul/lets_shard
|
34
|
-
licenses:
|
34
|
+
licenses:
|
35
|
+
- MIT
|
35
36
|
metadata: {}
|
36
37
|
post_install_message:
|
37
38
|
rdoc_options: []
|