cache-server-connector 0.0.1
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.
- data/.gitignore +5 -0
- data/Gemfile +4 -0
- data/Guardfile +5 -0
- data/README.md +44 -0
- data/Rakefile +1 -0
- data/cache-server-connector.gemspec +27 -0
- data/examples/sample.rb +25 -0
- data/lib/cache-server-connector.rb +70 -0
- data/lib/cache-server-connector/config.rb +5 -0
- data/lib/cache-server-connector/memcached-server.rb +11 -0
- data/lib/cache-server-connector/redis-server.rb +11 -0
- data/lib/cache-server-connector/server.rb +26 -0
- data/lib/cache-server-connector/version.rb +3 -0
- data/spec/cache-server-connector_spec.rb +36 -0
- data/spec/lib/config_spec.rb +1 -0
- data/spec/lib/memcached_server_spec.rb +14 -0
- data/spec/lib/redis_server_spec.rb +13 -0
- data/spec/lib/server_spec.rb +4 -0
- data/spec/spec_helper.rb +9 -0
- metadata +144 -0
data/Gemfile
ADDED
data/Guardfile
ADDED
data/README.md
ADDED
@@ -0,0 +1,44 @@
|
|
1
|
+
#Cache Server Connector
|
2
|
+
======================
|
3
|
+
|
4
|
+
A simple cache server connector for Memcached and Redis server.
|
5
|
+
|
6
|
+
###Index Type
|
7
|
+
* ROUND
|
8
|
+
* HASH
|
9
|
+
* WEIGHT
|
10
|
+
* COUNT
|
11
|
+
|
12
|
+
It's just a connector, it won't provide data access method like set or replace etc.
|
13
|
+
|
14
|
+
###Installation
|
15
|
+
gem install cache-server-connector
|
16
|
+
|
17
|
+
###Usage
|
18
|
+
``` ruby
|
19
|
+
require 'cache-server-connector'
|
20
|
+
|
21
|
+
csc = CSC::CSConnector.new
|
22
|
+
|
23
|
+
csc.add_memcached('127.0.0.1', 1)
|
24
|
+
csc.add_redis('127.0.0.1', 3)
|
25
|
+
|
26
|
+
#COUNT
|
27
|
+
100.times do |_|
|
28
|
+
puts csc.next_server
|
29
|
+
end
|
30
|
+
|
31
|
+
#HASH
|
32
|
+
csc.index_type = CSC::HASH
|
33
|
+
|
34
|
+
100.times do |_|
|
35
|
+
puts csc.next_server(Time.new.to_s)
|
36
|
+
end
|
37
|
+
|
38
|
+
#WEIGHT
|
39
|
+
csc.index_type = CSC::WEIGHT
|
40
|
+
|
41
|
+
100.times do |_|
|
42
|
+
puts csc.next_server
|
43
|
+
end
|
44
|
+
```
|
data/Rakefile
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require "bundler/gem_tasks"
|
@@ -0,0 +1,27 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
require "cache-server-connector/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = "cache-server-connector"
|
7
|
+
s.version = CSC::VERSION
|
8
|
+
s.authors = ["boostbob"]
|
9
|
+
s.email = ["1982wb@gmail.com"]
|
10
|
+
s.homepage = ""
|
11
|
+
s.summary = %q{A cache server connector}
|
12
|
+
s.description = %q{A simple cache server connector for Memcached and Redis server, ip Hash and Weight are both supported.}
|
13
|
+
|
14
|
+
s.rubyforge_project = "cache-server-connector"
|
15
|
+
|
16
|
+
s.files = `git ls-files`.split("\n")
|
17
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
18
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
19
|
+
s.require_paths = ["lib"]
|
20
|
+
|
21
|
+
# specify any dependencies here; for example:
|
22
|
+
s.add_development_dependency "guard"
|
23
|
+
s.add_development_dependency "guard-rspec"
|
24
|
+
s.add_development_dependency "rspec"
|
25
|
+
s.add_development_dependency "growl"
|
26
|
+
# s.add_runtime_dependency "rest-client"
|
27
|
+
end
|
data/examples/sample.rb
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
require 'cache-server-connector'
|
2
|
+
|
3
|
+
csc = CSC::CSConnector.new
|
4
|
+
|
5
|
+
csc.add_memcached('127.0.0.1', 1)
|
6
|
+
csc.add_redis('127.0.0.1', 3)
|
7
|
+
|
8
|
+
#COUNT
|
9
|
+
100.times do |_|
|
10
|
+
puts csc.next_server
|
11
|
+
end
|
12
|
+
|
13
|
+
#HASH
|
14
|
+
csc.index_type = CSC::HASH
|
15
|
+
|
16
|
+
100.times do |_|
|
17
|
+
puts csc.next_server(Time.new.to_s)
|
18
|
+
end
|
19
|
+
|
20
|
+
#WEIGHT
|
21
|
+
csc.index_type = CSC::WEIGHT
|
22
|
+
|
23
|
+
100.times do |_|
|
24
|
+
puts csc.next_server
|
25
|
+
end
|
@@ -0,0 +1,70 @@
|
|
1
|
+
ROOT = File.expand_path(File.dirname(__FILE__))
|
2
|
+
|
3
|
+
require File.join(ROOT, 'cache-server-connector', 'config')
|
4
|
+
require File.join(ROOT, 'cache-server-connector', 'server')
|
5
|
+
require File.join(ROOT, 'cache-server-connector', 'memcached-server')
|
6
|
+
require File.join(ROOT, 'cache-server-connector', 'redis-server')
|
7
|
+
|
8
|
+
require 'digest/md5'
|
9
|
+
|
10
|
+
module CSC
|
11
|
+
class CSConnector
|
12
|
+
attr_writer :index_type
|
13
|
+
|
14
|
+
def initialize
|
15
|
+
@index_type = CSC::COUNT
|
16
|
+
@servers = []
|
17
|
+
end
|
18
|
+
|
19
|
+
def add_memcached(host, weight = 1, port = 11211)
|
20
|
+
server = MemcachedServer.new(host, weight, port)
|
21
|
+
yield(server) if block_given?
|
22
|
+
@servers << server
|
23
|
+
end
|
24
|
+
|
25
|
+
def add_redis(host, weight = 1, port = 6379)
|
26
|
+
server = RedisServer.new(host, weight, port)
|
27
|
+
yield(server) if block_given?
|
28
|
+
@servers << server
|
29
|
+
end
|
30
|
+
|
31
|
+
def next_server(source = '')
|
32
|
+
case @index_type
|
33
|
+
when CSC::COUNT then next_count_server
|
34
|
+
when CSC::HASH then next_hash_server(source)
|
35
|
+
when CSC::WEIGHT then next_weight_server
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
protected
|
40
|
+
def called_sort
|
41
|
+
@servers.sort_by { |server| server.called }
|
42
|
+
end
|
43
|
+
|
44
|
+
def weight_called_sort
|
45
|
+
@servers.sort_by { |server| server.weight_called }
|
46
|
+
end
|
47
|
+
|
48
|
+
def next_hash_server(source)
|
49
|
+
hash = Digest::MD5.hexdigest(source)
|
50
|
+
hex_num = hash[0...6].hex
|
51
|
+
@servers[hex_num % @servers.count].indexed
|
52
|
+
end
|
53
|
+
|
54
|
+
def next_weight_server
|
55
|
+
server = @servers[0]
|
56
|
+
@servers.each do |s|
|
57
|
+
server = s if s.weight_called < server.weight_called
|
58
|
+
end
|
59
|
+
server.indexed
|
60
|
+
end
|
61
|
+
|
62
|
+
def next_count_server
|
63
|
+
server = @servers[0]
|
64
|
+
@servers.each do |s|
|
65
|
+
server = s if s.called < server.called
|
66
|
+
end
|
67
|
+
server.indexed
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require 'thread'
|
2
|
+
|
3
|
+
module CSC
|
4
|
+
class Server
|
5
|
+
attr_accessor :host, :weight, :port, :called, :weight_called
|
6
|
+
|
7
|
+
def initialize(host, weight = 1, port = 0)
|
8
|
+
raise NotImplementedError.new("#{self.class.name} is an abstract class.")
|
9
|
+
end
|
10
|
+
|
11
|
+
def indexed
|
12
|
+
@mutex ||= Mutex.new
|
13
|
+
|
14
|
+
@mutex.synchronize {
|
15
|
+
@called += 1
|
16
|
+
@weight_called = (@called + 1 / @weight).to_i
|
17
|
+
}
|
18
|
+
|
19
|
+
self
|
20
|
+
end
|
21
|
+
|
22
|
+
def to_s
|
23
|
+
"#@host:#@port"
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
require 'spec/spec_helper.rb'
|
2
|
+
|
3
|
+
describe CSC::CSConnector do
|
4
|
+
before(:each) do
|
5
|
+
@csc = CSC::CSConnector.new
|
6
|
+
@csc.add_memcached('127.0.0.1')
|
7
|
+
@csc.add_memcached('127.0.0.1', 2, 11212)
|
8
|
+
@csc.add_redis('127.0.0.1')
|
9
|
+
@csc.add_redis('127.0.0.1', 4, 6380)
|
10
|
+
end
|
11
|
+
|
12
|
+
it "shoud count" do
|
13
|
+
@csc.index_type = CSC::COUNT
|
14
|
+
|
15
|
+
100.times do |_|
|
16
|
+
puts @csc.next_server
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
it "should get the same server with same source" do
|
21
|
+
@csc.index_type = CSC::HASH
|
22
|
+
str = @csc.next_server("abc").to_s
|
23
|
+
|
24
|
+
100.times do |_|
|
25
|
+
@csc.next_server("abc").to_s.should == str
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
it "shoud weight" do
|
30
|
+
@csc.index_type = CSC::WEIGHT
|
31
|
+
|
32
|
+
100.times do |_|
|
33
|
+
puts @csc.next_server
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
require 'spec/spec_helper'
|
@@ -0,0 +1,14 @@
|
|
1
|
+
require 'spec/spec_helper'
|
2
|
+
|
3
|
+
describe CSC::MemcachedServer do
|
4
|
+
it "should equal concat(host, port) in to_s" do
|
5
|
+
s = CSC::MemcachedServer.new('127.0.0.1')
|
6
|
+
s.to_s.should == '127.0.0.1:11211'
|
7
|
+
end
|
8
|
+
|
9
|
+
it "should increase called counter" do
|
10
|
+
s = CSC::MemcachedServer.new('127.0.0.1')
|
11
|
+
100.times { s.indexed }
|
12
|
+
s.called.should == 100
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
require 'spec/spec_helper'
|
2
|
+
describe CSC::RedisServer do
|
3
|
+
it "should eqaul concat(host, port) in to_s" do
|
4
|
+
s = CSC::RedisServer.new('127.0.0.1')
|
5
|
+
s.to_s.should == '127.0.0.1:6379'
|
6
|
+
end
|
7
|
+
|
8
|
+
it "should increase called counter" do
|
9
|
+
s = CSC::RedisServer.new('127.0.0.1')
|
10
|
+
100.times { s.indexed }
|
11
|
+
s.called.should == 100
|
12
|
+
end
|
13
|
+
end
|
data/spec/spec_helper.rb
ADDED
metadata
ADDED
@@ -0,0 +1,144 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: cache-server-connector
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
hash: 29
|
5
|
+
prerelease:
|
6
|
+
segments:
|
7
|
+
- 0
|
8
|
+
- 0
|
9
|
+
- 1
|
10
|
+
version: 0.0.1
|
11
|
+
platform: ruby
|
12
|
+
authors:
|
13
|
+
- boostbob
|
14
|
+
autorequire:
|
15
|
+
bindir: bin
|
16
|
+
cert_chain: []
|
17
|
+
|
18
|
+
date: 2012-06-03 00:00:00 Z
|
19
|
+
dependencies:
|
20
|
+
- !ruby/object:Gem::Dependency
|
21
|
+
name: guard
|
22
|
+
prerelease: false
|
23
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
24
|
+
none: false
|
25
|
+
requirements:
|
26
|
+
- - ">="
|
27
|
+
- !ruby/object:Gem::Version
|
28
|
+
hash: 3
|
29
|
+
segments:
|
30
|
+
- 0
|
31
|
+
version: "0"
|
32
|
+
type: :development
|
33
|
+
version_requirements: *id001
|
34
|
+
- !ruby/object:Gem::Dependency
|
35
|
+
name: guard-rspec
|
36
|
+
prerelease: false
|
37
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
38
|
+
none: false
|
39
|
+
requirements:
|
40
|
+
- - ">="
|
41
|
+
- !ruby/object:Gem::Version
|
42
|
+
hash: 3
|
43
|
+
segments:
|
44
|
+
- 0
|
45
|
+
version: "0"
|
46
|
+
type: :development
|
47
|
+
version_requirements: *id002
|
48
|
+
- !ruby/object:Gem::Dependency
|
49
|
+
name: rspec
|
50
|
+
prerelease: false
|
51
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
52
|
+
none: false
|
53
|
+
requirements:
|
54
|
+
- - ">="
|
55
|
+
- !ruby/object:Gem::Version
|
56
|
+
hash: 3
|
57
|
+
segments:
|
58
|
+
- 0
|
59
|
+
version: "0"
|
60
|
+
type: :development
|
61
|
+
version_requirements: *id003
|
62
|
+
- !ruby/object:Gem::Dependency
|
63
|
+
name: growl
|
64
|
+
prerelease: false
|
65
|
+
requirement: &id004 !ruby/object:Gem::Requirement
|
66
|
+
none: false
|
67
|
+
requirements:
|
68
|
+
- - ">="
|
69
|
+
- !ruby/object:Gem::Version
|
70
|
+
hash: 3
|
71
|
+
segments:
|
72
|
+
- 0
|
73
|
+
version: "0"
|
74
|
+
type: :development
|
75
|
+
version_requirements: *id004
|
76
|
+
description: A simple cache server connector for Memcached and Redis server, ip Hash and Weight are both supported.
|
77
|
+
email:
|
78
|
+
- 1982wb@gmail.com
|
79
|
+
executables: []
|
80
|
+
|
81
|
+
extensions: []
|
82
|
+
|
83
|
+
extra_rdoc_files: []
|
84
|
+
|
85
|
+
files:
|
86
|
+
- .gitignore
|
87
|
+
- Gemfile
|
88
|
+
- Guardfile
|
89
|
+
- README.md
|
90
|
+
- Rakefile
|
91
|
+
- cache-server-connector.gemspec
|
92
|
+
- examples/sample.rb
|
93
|
+
- lib/cache-server-connector.rb
|
94
|
+
- lib/cache-server-connector/config.rb
|
95
|
+
- lib/cache-server-connector/memcached-server.rb
|
96
|
+
- lib/cache-server-connector/redis-server.rb
|
97
|
+
- lib/cache-server-connector/server.rb
|
98
|
+
- lib/cache-server-connector/version.rb
|
99
|
+
- spec/cache-server-connector_spec.rb
|
100
|
+
- spec/lib/config_spec.rb
|
101
|
+
- spec/lib/memcached_server_spec.rb
|
102
|
+
- spec/lib/redis_server_spec.rb
|
103
|
+
- spec/lib/server_spec.rb
|
104
|
+
- spec/spec_helper.rb
|
105
|
+
homepage: ""
|
106
|
+
licenses: []
|
107
|
+
|
108
|
+
post_install_message:
|
109
|
+
rdoc_options: []
|
110
|
+
|
111
|
+
require_paths:
|
112
|
+
- lib
|
113
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
114
|
+
none: false
|
115
|
+
requirements:
|
116
|
+
- - ">="
|
117
|
+
- !ruby/object:Gem::Version
|
118
|
+
hash: 3
|
119
|
+
segments:
|
120
|
+
- 0
|
121
|
+
version: "0"
|
122
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
123
|
+
none: false
|
124
|
+
requirements:
|
125
|
+
- - ">="
|
126
|
+
- !ruby/object:Gem::Version
|
127
|
+
hash: 3
|
128
|
+
segments:
|
129
|
+
- 0
|
130
|
+
version: "0"
|
131
|
+
requirements: []
|
132
|
+
|
133
|
+
rubyforge_project: cache-server-connector
|
134
|
+
rubygems_version: 1.8.10
|
135
|
+
signing_key:
|
136
|
+
specification_version: 3
|
137
|
+
summary: A cache server connector
|
138
|
+
test_files:
|
139
|
+
- spec/cache-server-connector_spec.rb
|
140
|
+
- spec/lib/config_spec.rb
|
141
|
+
- spec/lib/memcached_server_spec.rb
|
142
|
+
- spec/lib/redis_server_spec.rb
|
143
|
+
- spec/lib/server_spec.rb
|
144
|
+
- spec/spec_helper.rb
|