xunch 0.0.10.3 → 0.0.11

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 7a823df55ee04eec6dd9cb198b9219d633228e58
4
- data.tar.gz: 8ef44351fd2de4129f2060918fdef8754d31bb41
3
+ metadata.gz: 9a0afe0ef5426b25109b7d7b53635235ca52eccc
4
+ data.tar.gz: 62a5467a1f9ee1b4dc03e98db8ac522ea0b8d11f
5
5
  SHA512:
6
- metadata.gz: 36e5ac51f6ca81bb02baece72e0bf7e6720723d843df6d7d0d748bf9bfcf12846f19a9053fe70a483d5a9cbae236cbb2f2917a4cf7e045dd8f633738451d7a6e
7
- data.tar.gz: e05efd775ea4e6b4811b0e37f48197184812dcd098350a543c16279014d4643ea6203226cd3f7f455c8f6deaea354c18032cbd535e6540515dfb25db2dd1eaf7
6
+ metadata.gz: 0698d73d427538458e290f381dc378de21ebd5500e662ddeaa43a18f4d88266feefa3bdb210d2ffdef7b0480f06e64cc940e341769bfc443c175325c83cb10af
7
+ data.tar.gz: 00fd358f5349aef1756ca282cb5359bc3506af2b547f86ef236c3faa3f673f0cf349150d3f99792f74582cb4682654a6fe17b53fa82017b315ccc5f971d55805
@@ -35,8 +35,18 @@ module Xunch
35
35
 
36
36
  protected
37
37
  def getCacheObjectKey(value)
38
- key = value.send(@options[:key_field_name])
39
- raise ArgumentError("value #{value} key field can not be nil.") unless key != nil
38
+ key = nil
39
+ @options[:key_field_name].each do |field|
40
+ v = value.send(field)
41
+ if v == nil
42
+ raise ArgumentError("value #{value} key field #{field} can not be nil.")
43
+ end
44
+ if key
45
+ key = key.concat("-").concat(v.to_s)
46
+ else
47
+ key = v.to_s
48
+ end
49
+ end
40
50
  key
41
51
  end
42
52
 
@@ -77,7 +87,7 @@ module Xunch
77
87
  end
78
88
 
79
89
  if(options["key_field_name"] != nil)
80
- key_field_name = options["key_field_name"]
90
+ key_field_name = options["key_field_name"].split(",")
81
91
  use_options.store(:key_field_name, key_field_name)
82
92
  end
83
93
 
@@ -1,5 +1,5 @@
1
1
  module Xunch
2
- # maintain a consistency hash ring
2
+ # maintain a consistency hash ring
3
3
  # this ring must be same as other language xunch sharded
4
4
  class Sharded
5
5
  include Murmurhash
@@ -47,4 +47,4 @@ module Xunch
47
47
  return key
48
48
  end
49
49
  end
50
- end
50
+ end
@@ -4,7 +4,7 @@ module Xunch
4
4
  array = field.split("_")
5
5
  field_mod = array[0]
6
6
  for i in 1 .. array.length-1 do
7
- field_mod << array[i].capitalize
7
+ field_mod << array[i].capitalize
8
8
  end
9
9
  field_mod.freeze
10
10
  end
@@ -20,5 +20,24 @@ module Xunch
20
20
  }
21
21
  formatted_fields
22
22
  end
23
+
24
+ #
25
+ # 在multi key field的场景下,提供的辅助方法来拼接出key
26
+ # @params fields an array of key filed value
27
+ #
28
+ def self.concat_key_field(fields)
29
+ key = nil
30
+ fields.each do |field|
31
+ if field == nil
32
+ raise ArgumentError("key field #{field} can not be nil.")
33
+ end
34
+ if key
35
+ key = key.concat("-").concat(field.to_s)
36
+ else
37
+ key = field.to_s
38
+ end
39
+ end
40
+ key
41
+ end
23
42
  end
24
43
  end
@@ -0,0 +1,259 @@
1
+ $:.unshift File.expand_path("../../lib", __FILE__)
2
+ $:.unshift File.expand_path("../../test", __FILE__)
3
+ require "test/unit"
4
+ require "xunch"
5
+ require 'yaml'
6
+ require 'test_helper'
7
+
8
+ class MultiKeyCacheTest < Test::Unit::TestCase
9
+ include Test::Unit::Assertions
10
+ def setup
11
+ super
12
+ root = File.expand_path("../..", __FILE__)
13
+ file = File.join(root, 'test/xunch2.yaml')
14
+ caches = Xunch::CacheBuilder.build(file)
15
+ @object_cache = caches["track"]
16
+ hash = TestHelper.build_objects
17
+ @cache_object = hash["object"]
18
+ @cache_objects = hash["objects"]
19
+ @keys = []
20
+ @cache_objects.each do |obj|
21
+ @keys.push("#{obj.id}-#{obj.track_id}")
22
+ end
23
+ puts "setup"
24
+ end
25
+
26
+ def test_get_set
27
+ puts "ObjectCacheTest test_get_set method start"
28
+ puts @cache_object.track_id.class.name
29
+ assert_equal('OK',@object_cache.put(@cache_object))
30
+ object = @object_cache.get("#{@cache_object.id}-#{@cache_object.track_id}")
31
+
32
+ # type assert
33
+ assert_equal(Time.name,object.created_at.class.name)
34
+ assert_equal(Time.name,object.updated_at.class.name)
35
+ assert_equal(Time.name,object.approved_at.class.name)
36
+ assert_equal(FalseClass.name,object.is_crawler.class.name)
37
+ assert_equal(TrueClass.name,object.is_public.class.name)
38
+ assert_equal(Fixnum.name,object.mp3size.class.name)
39
+ assert_equal(BigDecimal.name,object.longitude.class.name)
40
+ assert_equal(Fixnum.name,object.track_id.class.name)
41
+ assert_equal(String.name,object.play_path.class.name)
42
+
43
+ #value assert
44
+ assert_equal(@cache_object.track_id,object.track_id)
45
+ assert_equal(@cache_object.track_uid,object.track_uid)
46
+ assert_equal(@cache_object.track_upload_source,object.track_upload_source)
47
+ assert_equal(@cache_object.op_type,object.op_type)
48
+ assert_equal(@cache_object.is_publish,object.is_publish)
49
+ assert_equal(@cache_object.upload_source,object.upload_source)
50
+ assert_equal(@cache_object.uid,object.uid)
51
+ assert_equal(@cache_object.nickname,object.nickname)
52
+ assert_equal(@cache_object.avatar_path,object.avatar_path)
53
+ assert_equal(@cache_object.is_v,object.is_v)
54
+ assert_equal(@cache_object.human_category_id,object.human_category_id)
55
+ assert_equal(@cache_object.title,object.title)
56
+ assert_equal(@cache_object.intro,object.intro)
57
+ assert_equal(@cache_object.user_source,object.user_source)
58
+ assert_equal(@cache_object.category_id,object.category_id)
59
+ assert_equal(@cache_object.duration,object.duration)
60
+ assert_equal(@cache_object.play_path,object.play_path)
61
+ assert_equal(@cache_object.play_path_32,object.play_path_32)
62
+ assert_equal(@cache_object.play_path_64,object.play_path_64)
63
+ assert_equal(@cache_object.play_path_128,object.play_path_128)
64
+ assert_equal(@cache_object.transcode_state,object.transcode_state)
65
+ assert_equal(@cache_object.download_path,object.download_path)
66
+ assert_equal(@cache_object.cover_path,object.cover_path)
67
+ assert_equal(@cache_object.album_id,object.album_id)
68
+ assert_equal(@cache_object.album_title,object.album_title)
69
+ assert_equal(@cache_object.album_cover_path,object.album_cover_path)
70
+ assert_equal(@cache_object.tags,object.tags)
71
+ assert_equal(@cache_object.ignore_tags,object.ignore_tags)
72
+ assert_equal(@cache_object.extra_tags,object.extra_tags)
73
+ assert_equal(@cache_object.singer,object.singer)
74
+ assert_equal(@cache_object.singer_category,object.singer_category)
75
+ assert_equal(@cache_object.author,object.author)
76
+ assert_equal(@cache_object.composer,object.composer)
77
+ assert_equal(@cache_object.arrangement,object.arrangement)
78
+ assert_equal(@cache_object.post_production,object.post_production)
79
+ assert_equal(@cache_object.lyric_path,object.lyric_path)
80
+ assert_equal(@cache_object.language,object.language)
81
+ assert_equal(@cache_object.lyric,object.lyric)
82
+ assert_equal(@cache_object.resinger,object.resinger)
83
+ assert_equal(@cache_object.announcer,object.announcer)
84
+ assert_equal(@cache_object.is_public,object.is_public)
85
+ assert_equal(@cache_object.access_password,object.access_password)
86
+ assert_equal(@cache_object.allow_download,object.allow_download)
87
+ assert_equal(@cache_object.allow_comment,object.allow_comment)
88
+ assert_equal(@cache_object.is_crawler,object.is_crawler)
89
+ assert_equal(@cache_object.inet_aton_ip,object.inet_aton_ip)
90
+ assert_equal(@cache_object.longitude,object.longitude)
91
+ assert_equal(@cache_object.latitude,object.latitude)
92
+ assert_equal(@cache_object.music_category,object.music_category)
93
+ assert_equal(@cache_object.order_num,object.order_num)
94
+ assert_equal(@cache_object.is_pick,object.is_pick)
95
+ assert_equal(@cache_object.rich_intro,object.rich_intro)
96
+ assert_equal(@cache_object.short_intro,object.short_intro)
97
+ assert_equal(@cache_object.comment_content,object.comment_content)
98
+ assert_equal(@cache_object.comment_id,object.comment_id)
99
+ assert_equal(@cache_object.dig_status,object.dig_status)
100
+ assert_equal(@cache_object.approved_at,object.approved_at)
101
+ assert_equal(@cache_object.is_deleted,object.is_deleted)
102
+ assert_equal(@cache_object.mp3size,object.mp3size)
103
+ assert_equal(@cache_object.mp3size_32,object.mp3size_32)
104
+ assert_equal(@cache_object.mp3size_64,object.mp3size_64)
105
+ assert_equal(@cache_object.waveform,object.waveform)
106
+ assert_equal(@cache_object.upload_id,object.upload_id)
107
+ assert_equal(@cache_object.updated_at,object.updated_at)
108
+ assert_equal(@cache_object.created_at,object.created_at)
109
+ assert_equal(@cache_object.source_url,object.source_url)
110
+ assert_equal(@cache_object.status,object.status)
111
+ assert_equal(@cache_object.explore_height,object.explore_height)
112
+ assert_equal(@cache_object.id,object.id)
113
+ puts "ObjectCacheTest test_get_set method stop"
114
+ end
115
+
116
+ def test_get_set_benchmark
117
+ puts "ObjectCacheTest test_get_set_benchmark method start"
118
+ @object_cache.evict(1)
119
+ times = TestHelper::TIMES
120
+ start = Time.now
121
+ for i in 1 .. times do
122
+ @object_cache.put(@cache_object)
123
+ end
124
+ stop = Time.now
125
+ puts "#{times} times put operation total use #{stop-start} seconds"
126
+
127
+ start = Time.now
128
+ for i in 1 .. times do
129
+ @object_cache.get(1)
130
+ end
131
+ stop = Time.now
132
+ puts "#{times} times get operation total use #{stop-start} seconds"
133
+ puts "ObjectCacheTest test_get_set_benchmark method stop"
134
+ end
135
+
136
+ def test_mget_mset
137
+ puts "ObjectCacheTest test_mget_mset method start"
138
+ result = @object_cache.multi_put(@cache_objects)
139
+ for i in 0 .. result.length - 1 do
140
+ success = false
141
+ if result[i] == "OK" or result[i] == true
142
+ success = true
143
+ end
144
+ assert_equal(true,success)
145
+ end
146
+ objects = @object_cache.multi_get(@keys)
147
+ assert_equal(@cache_objects.length, objects.length)
148
+ for i in 0 .. @cache_objects.length - 1 do
149
+ assert_equal(Time.name,objects[i].created_at.class.name)
150
+ assert_equal(Time.name,objects[i].updated_at.class.name)
151
+ assert_equal(Time.name,objects[i].approved_at.class.name)
152
+ assert_equal(FalseClass.name,objects[i].is_crawler.class.name)
153
+ assert_equal(TrueClass.name,objects[i].is_public.class.name)
154
+ assert_equal(Fixnum.name,objects[i].mp3size.class.name)
155
+ assert_equal(BigDecimal.name,objects[i].longitude.class.name)
156
+ assert_equal(Fixnum.name,objects[i].track_id.class.name)
157
+ assert_equal(String.name,objects[i].play_path.class.name)
158
+
159
+ #VALUE assert
160
+ assert_equal(@cache_objects[i].track_id,objects[i].track_id)
161
+ assert_equal(@cache_objects[i].track_uid,objects[i].track_uid)
162
+ assert_equal(@cache_objects[i].track_upload_source,objects[i].track_upload_source)
163
+ assert_equal(@cache_objects[i].op_type,objects[i].op_type)
164
+ assert_equal(@cache_objects[i].is_publish,objects[i].is_publish)
165
+ assert_equal(@cache_objects[i].upload_source,objects[i].upload_source)
166
+ assert_equal(@cache_objects[i].uid,objects[i].uid)
167
+ assert_equal(@cache_objects[i].nickname,objects[i].nickname)
168
+ assert_equal(@cache_objects[i].avatar_path,objects[i].avatar_path)
169
+ assert_equal(@cache_objects[i].is_v,objects[i].is_v)
170
+ assert_equal(@cache_objects[i].human_category_id,objects[i].human_category_id)
171
+ assert_equal(@cache_objects[i].title,objects[i].title)
172
+ assert_equal(@cache_objects[i].intro,objects[i].intro)
173
+ assert_equal(@cache_objects[i].user_source,objects[i].user_source)
174
+ assert_equal(@cache_objects[i].category_id,objects[i].category_id)
175
+ assert_equal(@cache_objects[i].duration,objects[i].duration)
176
+ assert_equal(@cache_objects[i].play_path,objects[i].play_path)
177
+ assert_equal(@cache_objects[i].play_path_32,objects[i].play_path_32)
178
+ assert_equal(@cache_objects[i].play_path_64,objects[i].play_path_64)
179
+ assert_equal(@cache_objects[i].play_path_128,objects[i].play_path_128)
180
+ assert_equal(@cache_objects[i].transcode_state,objects[i].transcode_state)
181
+ assert_equal(@cache_objects[i].download_path,objects[i].download_path)
182
+ assert_equal(@cache_objects[i].cover_path,objects[i].cover_path)
183
+ assert_equal(@cache_objects[i].album_id,objects[i].album_id)
184
+ assert_equal(@cache_objects[i].album_title,objects[i].album_title)
185
+ assert_equal(@cache_objects[i].album_cover_path,objects[i].album_cover_path)
186
+ assert_equal(@cache_objects[i].tags,objects[i].tags)
187
+ assert_equal(@cache_objects[i].ignore_tags,objects[i].ignore_tags)
188
+ assert_equal(@cache_objects[i].extra_tags,objects[i].extra_tags)
189
+ assert_equal(@cache_objects[i].singer,objects[i].singer)
190
+ assert_equal(@cache_objects[i].singer_category,objects[i].singer_category)
191
+ assert_equal(@cache_objects[i].author,objects[i].author)
192
+ assert_equal(@cache_objects[i].composer,objects[i].composer)
193
+ assert_equal(@cache_objects[i].arrangement,objects[i].arrangement)
194
+ assert_equal(@cache_objects[i].post_production,objects[i].post_production)
195
+ assert_equal(@cache_objects[i].lyric_path,objects[i].lyric_path)
196
+ assert_equal(@cache_objects[i].language,objects[i].language)
197
+ assert_equal(@cache_objects[i].lyric,objects[i].lyric)
198
+ assert_equal(@cache_objects[i].resinger,objects[i].resinger)
199
+ assert_equal(@cache_objects[i].announcer,objects[i].announcer)
200
+ assert_equal(@cache_objects[i].is_public,objects[i].is_public)
201
+ assert_equal(@cache_objects[i].access_password,objects[i].access_password)
202
+ assert_equal(@cache_objects[i].allow_download,objects[i].allow_download)
203
+ assert_equal(@cache_objects[i].allow_comment,objects[i].allow_comment)
204
+ assert_equal(@cache_objects[i].is_crawler,objects[i].is_crawler)
205
+ assert_equal(@cache_objects[i].inet_aton_ip,objects[i].inet_aton_ip)
206
+ assert_equal(@cache_objects[i].longitude,objects[i].longitude)
207
+ assert_equal(@cache_objects[i].latitude,objects[i].latitude)
208
+ assert_equal(@cache_objects[i].music_category,objects[i].music_category)
209
+ assert_equal(@cache_objects[i].order_num,objects[i].order_num)
210
+ assert_equal(@cache_objects[i].is_pick,objects[i].is_pick)
211
+ assert_equal(@cache_objects[i].rich_intro,objects[i].rich_intro)
212
+ assert_equal(@cache_objects[i].short_intro,objects[i].short_intro)
213
+ assert_equal(@cache_objects[i].comment_content,objects[i].comment_content)
214
+ assert_equal(@cache_objects[i].comment_id,objects[i].comment_id)
215
+ assert_equal(@cache_objects[i].dig_status,objects[i].dig_status)
216
+ assert_equal(@cache_objects[i].approved_at,objects[i].approved_at)
217
+ assert_equal(@cache_objects[i].is_deleted,objects[i].is_deleted)
218
+ assert_equal(@cache_objects[i].mp3size,objects[i].mp3size)
219
+ assert_equal(@cache_objects[i].mp3size_32,objects[i].mp3size_32)
220
+ assert_equal(@cache_objects[i].mp3size_64,objects[i].mp3size_64)
221
+ assert_equal(@cache_objects[i].waveform,objects[i].waveform)
222
+ assert_equal(@cache_objects[i].upload_id,objects[i].upload_id)
223
+ assert_equal(@cache_objects[i].updated_at,objects[i].updated_at)
224
+ assert_equal(@cache_objects[i].created_at,objects[i].created_at)
225
+ assert_equal(@cache_objects[i].source_url,objects[i].source_url)
226
+ assert_equal(@cache_objects[i].status,objects[i].status)
227
+ assert_equal(@cache_objects[i].explore_height,objects[i].explore_height)
228
+ assert_equal(@cache_objects[i].id,objects[i].id)
229
+ end
230
+ puts "ObjectCacheTest test_mget_mset method stop"
231
+ end
232
+
233
+ def test_mget_mset_benchmark
234
+ puts "ObjectCacheTest test_mget_mset_benchmark method start"
235
+ @object_cache.batch_evict @keys
236
+
237
+ times = TestHelper::TIMES
238
+ start = Time.now
239
+ for i in 1 .. times do
240
+ @object_cache.multi_put(@cache_objects)
241
+ end
242
+ stop = Time.now
243
+ puts "#{times} times multi_put operation total use #{stop-start} seconds"
244
+
245
+ start = Time.now
246
+ for i in 1 .. times do
247
+ @object_cache.multi_get(@keys)
248
+ end
249
+ stop = Time.now
250
+ puts "#{times} times multi_get operation total use #{stop-start} seconds"
251
+ puts "ObjectCacheTest test_mget_mset_benchmark method stop"
252
+ end
253
+
254
+ def teardown
255
+ super
256
+ puts "teardown"
257
+ end
258
+ end
259
+
File without changes
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: xunch
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.10.3
4
+ version: 0.0.11
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ted Wang
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-04-01 00:00:00.000000000 Z
11
+ date: 2014-04-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: redis
@@ -79,10 +79,12 @@ files:
79
79
  - test/list_field_object_cache_test.rb
80
80
  - test/list_id_cache_test.rb
81
81
  - test/list_object_cache_test.rb
82
+ - test/multi_key_test.rb
82
83
  - test/nginx_cache_helper_test.rb
83
84
  - test/object_cache_test.rb
84
85
  - test/rb_tree_test.rb
85
86
  - test/redis_client_test.rb
87
+ - test/shard_test.rb
86
88
  homepage: http://www.ximalaya.com
87
89
  licenses:
88
90
  - Apache License Version 2.0
@@ -119,7 +121,9 @@ test_files:
119
121
  - test/list_field_object_cache_test.rb
120
122
  - test/list_id_cache_test.rb
121
123
  - test/list_object_cache_test.rb
124
+ - test/multi_key_test.rb
122
125
  - test/nginx_cache_helper_test.rb
123
126
  - test/object_cache_test.rb
124
127
  - test/rb_tree_test.rb
125
128
  - test/redis_client_test.rb
129
+ - test/shard_test.rb