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.
@@ -0,0 +1,5 @@
1
+ *.gem
2
+ *.swp
3
+ .bundle
4
+ Gemfile.lock
5
+ pkg/*
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source "http://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in cache-server-connector.gemspec
4
+ gemspec
@@ -0,0 +1,5 @@
1
+ guard 'rspec', :version => 2 do
2
+ watch(%r{^spec/.+_spec\.rb$})
3
+ watch(%r{^lib/(.+)\.rb$}) { |m| "spec/lib/#{m[1]}_spec.rb" }
4
+ watch('spec/spec_helper.rb') { "spec" }
5
+ end
@@ -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
+ ```
@@ -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
@@ -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,5 @@
1
+ module CSC
2
+ COUNT = 1 #最少连接
3
+ HASH = 2 #哈希散列
4
+ WEIGHT = 3 #权重
5
+ end
@@ -0,0 +1,11 @@
1
+ module CSC
2
+ class MemcachedServer < Server
3
+ def initialize(host, weight = 1, port = 11211)
4
+ @host = host
5
+ @weight = weight
6
+ @port = port
7
+ @called = 0
8
+ @weight_called = 0
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,11 @@
1
+ module CSC
2
+ class RedisServer < Server
3
+ def initialize(host, weight = 1, port = 6379)
4
+ @host = host
5
+ @weight = weight
6
+ @port = port
7
+ @called = 0
8
+ @weight_called = 0
9
+ end
10
+ end
11
+ 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,3 @@
1
+ module CSC
2
+ VERSION = '0.0.1'
3
+ 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
@@ -0,0 +1,4 @@
1
+ require 'spec/spec_helper'
2
+
3
+ describe CSC::Server do
4
+ end
@@ -0,0 +1,9 @@
1
+ require 'cache-server-connector'
2
+
3
+ RSpec.configure do |config|
4
+ config.before(:each) do
5
+ end
6
+
7
+ config.after(:each) do
8
+ end
9
+ end
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