xunch 0.0.6

Sign up to get free protection for your applications and to get access to all the features.
Files changed (39) hide show
  1. checksums.yaml +7 -0
  2. data/lib/xunch.rb +25 -0
  3. data/lib/xunch/cache/cache.rb +88 -0
  4. data/lib/xunch/cache/cache_builder.rb +68 -0
  5. data/lib/xunch/cache/field_object_cache.rb +120 -0
  6. data/lib/xunch/cache/list_field_object_cache.rb +63 -0
  7. data/lib/xunch/cache/list_object_cache.rb +59 -0
  8. data/lib/xunch/cache/object_cache.rb +63 -0
  9. data/lib/xunch/codec/codec.rb +31 -0
  10. data/lib/xunch/codec/hash_codec.rb +98 -0
  11. data/lib/xunch/codec/json_codec.rb +81 -0
  12. data/lib/xunch/shard/redis.rb +270 -0
  13. data/lib/xunch/shard/shard_info.rb +37 -0
  14. data/lib/xunch/shard/shard_redis.rb +267 -0
  15. data/lib/xunch/shard/sharded.rb +50 -0
  16. data/lib/xunch/utils/exceptions.rb +11 -0
  17. data/lib/xunch/utils/nginx_cache_helper.rb +52 -0
  18. data/lib/xunch/utils/rb_tree.rb +634 -0
  19. data/lib/xunch/utils/rb_tree_node.rb +67 -0
  20. data/lib/xunch/utils/types.rb +8 -0
  21. data/lib/xunch/utils/utils.rb +24 -0
  22. data/test/benchmark_test.rb +68 -0
  23. data/test/cache_builder_test.rb +28 -0
  24. data/test/cache_object.rb +120 -0
  25. data/test/consistency_hash_test.rb +31 -0
  26. data/test/field_object_cache_test.rb +430 -0
  27. data/test/hash_codec_test.rb +57 -0
  28. data/test/json_codec_test.rb +57 -0
  29. data/test/list_field_object_cache_test.rb +211 -0
  30. data/test/list_object_cache_test.rb +211 -0
  31. data/test/nginx_cache_helper_test.rb +45 -0
  32. data/test/object_cache_test.rb +322 -0
  33. data/test/rb_tree_test.rb +48 -0
  34. data/test/redis_benchmark_test.rb +54 -0
  35. data/test/redis_test.rb +58 -0
  36. data/test/running_test.rb +212 -0
  37. data/test/test.rb +176 -0
  38. data/test/track_record_origin.rb +58 -0
  39. metadata +125 -0
@@ -0,0 +1,45 @@
1
+ $:.unshift File.expand_path("../../lib", __FILE__)
2
+ require "test/unit"
3
+ require 'xunch'
4
+
5
+ class NginxCacheHelperTest < Test::Unit::TestCase
6
+ include Test::Unit::Assertions
7
+ def setup
8
+ super
9
+ @helper = Xunch::NginxCacheHelper.new("www.ximalaya.com",nil,10)
10
+ puts "setup"
11
+ end
12
+
13
+ def test_evict
14
+ assert_true(@helper.evict("/1000001/"))
15
+ assert_true(@helper.evict("/1000002/"))
16
+ assert_true(@helper.evict("/1000003/"))
17
+ assert_true(@helper.evict("/1000004/"))
18
+ assert_true(@helper.evict("/1000005/"))
19
+ assert_true(@helper.evict("/1000006/"))
20
+ assert_true(@helper.evict("/1000007/"))
21
+ assert_true(@helper.evict("/1000008/"))
22
+ assert_true(@helper.evict("/1000009/"))
23
+ assert_true(@helper.evict("/1000010/"))
24
+ assert_false(@helper.cache("/1000010"))
25
+ end
26
+
27
+ def test_cache
28
+ assert_true(@helper.cache("/1000001/"))
29
+ assert_true(@helper.cache("/1000002/"))
30
+ assert_true(@helper.cache("/1000003/"))
31
+ assert_true(@helper.cache("/1000004/"))
32
+ assert_true(@helper.cache("/1000005/"))
33
+ assert_true(@helper.cache("/1000006/"))
34
+ assert_true(@helper.cache("/1000007/"))
35
+ assert_true(@helper.cache("/1000008/"))
36
+ assert_true(@helper.cache("/1000009/"))
37
+ assert_true(@helper.cache("/1000010/"))
38
+ assert_false(@helper.cache("/1000010"))
39
+ end
40
+
41
+ def teardown
42
+ super
43
+ puts "teardown"
44
+ end
45
+ end
@@ -0,0 +1,322 @@
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 'bigdecimal'
7
+ require 'hessian2'
8
+ require 'track_record_origin'
9
+
10
+ class ObjectCacheTest < Test::Unit::TestCase
11
+ include Test::Unit::Assertions
12
+ def setup
13
+ super
14
+ root = File.expand_path("../..", __FILE__)
15
+ file = File.join(root, 'test/xunch.yaml')
16
+ caches = Xunch::CacheBuilder.build(file)
17
+ @object_cache = caches["track"]
18
+ @cache_object = TrackRecordOrigin.find(1)
19
+ @cache_objects = [@cache_object]
20
+ @keys = [1]
21
+ for i in 2 .. 100 do
22
+ new_cache_object = TrackRecordOrigin.new
23
+ new_cache_object.track_id = @cache_object.track_id
24
+ new_cache_object.track_uid = @cache_object.track_uid
25
+ new_cache_object.track_upload_source = @cache_object.track_upload_source
26
+ new_cache_object.op_type = @cache_object.op_type
27
+ new_cache_object.is_publish = @cache_object.is_publish
28
+ new_cache_object.upload_source = @cache_object.upload_source
29
+ new_cache_object.uid = @cache_object.uid
30
+ new_cache_object.nickname = @cache_object.nickname
31
+ new_cache_object.avatar_path = @cache_object.avatar_path
32
+ new_cache_object.is_v = @cache_object.is_v
33
+ new_cache_object.human_category_id = @cache_object.human_category_id
34
+ new_cache_object.title = @cache_object.title
35
+ new_cache_object.intro = @cache_object.intro
36
+ new_cache_object.user_source = @cache_object.user_source
37
+ new_cache_object.category_id = @cache_object.category_id
38
+ new_cache_object.duration = @cache_object.duration
39
+ new_cache_object.play_path = @cache_object.play_path
40
+ new_cache_object.play_path_32 = @cache_object.play_path_32
41
+ new_cache_object.play_path_64 = @cache_object.play_path_64
42
+ new_cache_object.play_path_128 = @cache_object.play_path_128
43
+ new_cache_object.transcode_state = @cache_object.transcode_state
44
+ new_cache_object.download_path = @cache_object.download_path
45
+ new_cache_object.cover_path = @cache_object.cover_path
46
+ new_cache_object.album_id = @cache_object.album_id
47
+ new_cache_object.album_title = @cache_object.album_title
48
+ new_cache_object.album_cover_path = @cache_object.album_cover_path
49
+ new_cache_object.tags = @cache_object.tags
50
+ new_cache_object.ignore_tags = @cache_object.ignore_tags
51
+ new_cache_object.extra_tags = @cache_object.extra_tags
52
+ new_cache_object.singer = @cache_object.singer
53
+ new_cache_object.singer_category = @cache_object.singer_category
54
+ new_cache_object.author = @cache_object.author
55
+ new_cache_object.composer = @cache_object.composer
56
+ new_cache_object.arrangement = @cache_object.arrangement
57
+ new_cache_object.post_production = @cache_object.post_production
58
+ new_cache_object.lyric_path = @cache_object.lyric_path
59
+ new_cache_object.lyric = @cache_object.lyric
60
+ new_cache_object.language = @cache_object.language
61
+ new_cache_object.resinger = @cache_object.resinger
62
+ new_cache_object.announcer = @cache_object.announcer
63
+ new_cache_object.is_public = @cache_object.is_public
64
+ new_cache_object.access_password = @cache_object.access_password
65
+ new_cache_object.allow_download = @cache_object.allow_download
66
+ new_cache_object.allow_comment = @cache_object.allow_comment
67
+ new_cache_object.is_crawler = @cache_object.is_crawler
68
+ new_cache_object.inet_aton_ip = @cache_object.inet_aton_ip
69
+ new_cache_object.longitude = @cache_object.longitude
70
+ new_cache_object.latitude = @cache_object.latitude
71
+ new_cache_object.music_category = @cache_object.music_category
72
+ new_cache_object.order_num = @cache_object.order_num
73
+ new_cache_object.is_pick = @cache_object.is_pick
74
+ new_cache_object.rich_intro = @cache_object.rich_intro
75
+ new_cache_object.short_intro = @cache_object.short_intro
76
+ new_cache_object.comment_content = @cache_object.comment_content
77
+ new_cache_object.comment_id = @cache_object.comment_id
78
+ new_cache_object.dig_status = @cache_object.dig_status
79
+ new_cache_object.approved_at = @cache_object.approved_at
80
+ new_cache_object.is_deleted = @cache_object.is_deleted
81
+ new_cache_object.mp3size = @cache_object.mp3size
82
+ new_cache_object.mp3size_32 = @cache_object.mp3size_32
83
+ new_cache_object.mp3size_64 = @cache_object.mp3size_64
84
+ new_cache_object.waveform = @cache_object.waveform
85
+ new_cache_object.upload_id = @cache_object.upload_id
86
+ new_cache_object.updated_at = @cache_object.updated_at
87
+ new_cache_object.created_at = @cache_object.created_at
88
+ new_cache_object.source_url = @cache_object.source_url
89
+ new_cache_object.status = @cache_object.status
90
+ new_cache_object.explore_height = @cache_object.explore_height
91
+ new_cache_object.id = i
92
+ @cache_objects.push new_cache_object
93
+ @keys.push new_cache_object.id
94
+ end
95
+ puts "setup"
96
+ end
97
+
98
+ def test_get_set
99
+ assert_equal('OK',@object_cache.put(@cache_object))
100
+ object = @object_cache.get(1)
101
+
102
+ # type assert
103
+ assert_equal(Time.name,object.created_at.class.name)
104
+ assert_equal(Time.name,object.updated_at.class.name)
105
+ assert_equal(Time.name,object.approved_at.class.name)
106
+ assert_equal(FalseClass.name,object.is_crawler.class.name)
107
+ assert_equal(TrueClass.name,object.is_public.class.name)
108
+ assert_equal(Fixnum.name,object.mp3size.class.name)
109
+ assert_equal(BigDecimal.name,object.longitude.class.name)
110
+ assert_equal(Bignum.name,object.track_id.class.name)
111
+ assert_equal(String.name,object.play_path.class.name)
112
+
113
+ #value assert
114
+ assert_equal(@cache_object.track_id,object.track_id)
115
+ assert_equal(@cache_object.track_uid,object.track_uid)
116
+ assert_equal(@cache_object.track_upload_source,object.track_upload_source)
117
+ assert_equal(@cache_object.op_type,object.op_type)
118
+ assert_equal(@cache_object.is_publish,object.is_publish)
119
+ assert_equal(@cache_object.upload_source,object.upload_source)
120
+ assert_equal(@cache_object.uid,object.uid)
121
+ assert_equal(@cache_object.nickname,object.nickname)
122
+ assert_equal(@cache_object.avatar_path,object.avatar_path)
123
+ assert_equal(@cache_object.is_v,object.is_v)
124
+ assert_equal(@cache_object.human_category_id,object.human_category_id)
125
+ assert_equal(@cache_object.title,object.title)
126
+ assert_equal(@cache_object.intro,object.intro)
127
+ assert_equal(@cache_object.user_source,object.user_source)
128
+ assert_equal(@cache_object.category_id,object.category_id)
129
+ assert_equal(@cache_object.duration,object.duration)
130
+ assert_equal(@cache_object.play_path,object.play_path)
131
+ assert_equal(@cache_object.play_path_32,object.play_path_32)
132
+ assert_equal(@cache_object.play_path_64,object.play_path_64)
133
+ assert_equal(@cache_object.play_path_128,object.play_path_128)
134
+ assert_equal(@cache_object.transcode_state,object.transcode_state)
135
+ assert_equal(@cache_object.download_path,object.download_path)
136
+ assert_equal(@cache_object.cover_path,object.cover_path)
137
+ assert_equal(@cache_object.album_id,object.album_id)
138
+ assert_equal(@cache_object.album_title,object.album_title)
139
+ assert_equal(@cache_object.album_cover_path,object.album_cover_path)
140
+ assert_equal(@cache_object.tags,object.tags)
141
+ assert_equal(@cache_object.ignore_tags,object.ignore_tags)
142
+ assert_equal(@cache_object.extra_tags,object.extra_tags)
143
+ assert_equal(@cache_object.singer,object.singer)
144
+ assert_equal(@cache_object.singer_category,object.singer_category)
145
+ assert_equal(@cache_object.author,object.author)
146
+ assert_equal(@cache_object.composer,object.composer)
147
+ assert_equal(@cache_object.arrangement,object.arrangement)
148
+ assert_equal(@cache_object.post_production,object.post_production)
149
+ assert_equal(@cache_object.lyric_path,object.lyric_path)
150
+ assert_equal(@cache_object.language,object.language)
151
+ assert_equal(@cache_object.lyric,object.lyric)
152
+ assert_equal(@cache_object.resinger,object.resinger)
153
+ assert_equal(@cache_object.announcer,object.announcer)
154
+ assert_equal(@cache_object.is_public,object.is_public)
155
+ assert_equal(@cache_object.access_password,object.access_password)
156
+ assert_equal(@cache_object.allow_download,object.allow_download)
157
+ assert_equal(@cache_object.allow_comment,object.allow_comment)
158
+ assert_equal(@cache_object.is_crawler,object.is_crawler)
159
+ assert_equal(@cache_object.inet_aton_ip,object.inet_aton_ip)
160
+ assert_equal(@cache_object.longitude,object.longitude)
161
+ assert_equal(@cache_object.latitude,object.latitude)
162
+ assert_equal(@cache_object.music_category,object.music_category)
163
+ assert_equal(@cache_object.order_num,object.order_num)
164
+ assert_equal(@cache_object.is_pick,object.is_pick)
165
+ assert_equal(@cache_object.rich_intro,object.rich_intro)
166
+ assert_equal(@cache_object.short_intro,object.short_intro)
167
+ assert_equal(@cache_object.comment_content,object.comment_content)
168
+ assert_equal(@cache_object.comment_id,object.comment_id)
169
+ assert_equal(@cache_object.dig_status,object.dig_status)
170
+ assert_equal(@cache_object.approved_at,object.approved_at)
171
+ assert_equal(@cache_object.is_deleted,object.is_deleted)
172
+ assert_equal(@cache_object.mp3size,object.mp3size)
173
+ assert_equal(@cache_object.mp3size_32,object.mp3size_32)
174
+ assert_equal(@cache_object.mp3size_64,object.mp3size_64)
175
+ assert_equal(@cache_object.waveform,object.waveform)
176
+ assert_equal(@cache_object.upload_id,object.upload_id)
177
+ assert_equal(@cache_object.updated_at,object.updated_at)
178
+ assert_equal(@cache_object.created_at,object.created_at)
179
+ assert_equal(@cache_object.source_url,object.source_url)
180
+ assert_equal(@cache_object.status,object.status)
181
+ assert_equal(@cache_object.explore_height,object.explore_height)
182
+ assert_equal(@cache_object.id,object.id)
183
+ end
184
+
185
+ def test_get_set_benchmark
186
+ @object_cache.evict(1)
187
+ times = 1000
188
+ start = Time.now
189
+ for i in 1 .. times do
190
+ @object_cache.put(@cache_object)
191
+ end
192
+ stop = Time.now
193
+ puts "#{times} times put operation total use #{stop-start} seconds"
194
+
195
+ start = Time.now
196
+ for i in 1 .. times do
197
+ @object_cache.get(1)
198
+ end
199
+ stop = Time.now
200
+ puts "#{times} times get operation total use #{stop-start} seconds"
201
+ end
202
+
203
+ def test_mget_mset
204
+ result = @object_cache.multi_put(@cache_objects)
205
+ for i in 0 .. result.length - 1 do
206
+ success = false
207
+ if result[i] == "OK" or result[i] == true
208
+ success = true
209
+ end
210
+ assert_equal(true,success)
211
+ end
212
+ objects = @object_cache.multi_get(@keys)
213
+ assert_equal(@cache_objects.length, objects.length)
214
+ for i in 0 .. @cache_objects.length - 1 do
215
+ assert_equal(Time.name,objects[i].created_at.class.name)
216
+ assert_equal(Time.name,objects[i].updated_at.class.name)
217
+ assert_equal(Time.name,objects[i].approved_at.class.name)
218
+ assert_equal(FalseClass.name,objects[i].is_crawler.class.name)
219
+ assert_equal(TrueClass.name,objects[i].is_public.class.name)
220
+ assert_equal(Fixnum.name,objects[i].mp3size.class.name)
221
+ assert_equal(BigDecimal.name,objects[i].longitude.class.name)
222
+ assert_equal(Bignum.name,objects[i].track_id.class.name)
223
+ assert_equal(String.name,objects[i].play_path.class.name)
224
+
225
+ #VALUE assert
226
+ assert_equal(@cache_objects[i].track_id,objects[i].track_id)
227
+ assert_equal(@cache_objects[i].track_uid,objects[i].track_uid)
228
+ assert_equal(@cache_objects[i].track_upload_source,objects[i].track_upload_source)
229
+ assert_equal(@cache_objects[i].op_type,objects[i].op_type)
230
+ assert_equal(@cache_objects[i].is_publish,objects[i].is_publish)
231
+ assert_equal(@cache_objects[i].upload_source,objects[i].upload_source)
232
+ assert_equal(@cache_objects[i].uid,objects[i].uid)
233
+ assert_equal(@cache_objects[i].nickname,objects[i].nickname)
234
+ assert_equal(@cache_objects[i].avatar_path,objects[i].avatar_path)
235
+ assert_equal(@cache_objects[i].is_v,objects[i].is_v)
236
+ assert_equal(@cache_objects[i].human_category_id,objects[i].human_category_id)
237
+ assert_equal(@cache_objects[i].title,objects[i].title)
238
+ assert_equal(@cache_objects[i].intro,objects[i].intro)
239
+ assert_equal(@cache_objects[i].user_source,objects[i].user_source)
240
+ assert_equal(@cache_objects[i].category_id,objects[i].category_id)
241
+ assert_equal(@cache_objects[i].duration,objects[i].duration)
242
+ assert_equal(@cache_objects[i].play_path,objects[i].play_path)
243
+ assert_equal(@cache_objects[i].play_path_32,objects[i].play_path_32)
244
+ assert_equal(@cache_objects[i].play_path_64,objects[i].play_path_64)
245
+ assert_equal(@cache_objects[i].play_path_128,objects[i].play_path_128)
246
+ assert_equal(@cache_objects[i].transcode_state,objects[i].transcode_state)
247
+ assert_equal(@cache_objects[i].download_path,objects[i].download_path)
248
+ assert_equal(@cache_objects[i].cover_path,objects[i].cover_path)
249
+ assert_equal(@cache_objects[i].album_id,objects[i].album_id)
250
+ assert_equal(@cache_objects[i].album_title,objects[i].album_title)
251
+ assert_equal(@cache_objects[i].album_cover_path,objects[i].album_cover_path)
252
+ assert_equal(@cache_objects[i].tags,objects[i].tags)
253
+ assert_equal(@cache_objects[i].ignore_tags,objects[i].ignore_tags)
254
+ assert_equal(@cache_objects[i].extra_tags,objects[i].extra_tags)
255
+ assert_equal(@cache_objects[i].singer,objects[i].singer)
256
+ assert_equal(@cache_objects[i].singer_category,objects[i].singer_category)
257
+ assert_equal(@cache_objects[i].author,objects[i].author)
258
+ assert_equal(@cache_objects[i].composer,objects[i].composer)
259
+ assert_equal(@cache_objects[i].arrangement,objects[i].arrangement)
260
+ assert_equal(@cache_objects[i].post_production,objects[i].post_production)
261
+ assert_equal(@cache_objects[i].lyric_path,objects[i].lyric_path)
262
+ assert_equal(@cache_objects[i].language,objects[i].language)
263
+ assert_equal(@cache_objects[i].lyric,objects[i].lyric)
264
+ assert_equal(@cache_objects[i].resinger,objects[i].resinger)
265
+ assert_equal(@cache_objects[i].announcer,objects[i].announcer)
266
+ assert_equal(@cache_objects[i].is_public,objects[i].is_public)
267
+ assert_equal(@cache_objects[i].access_password,objects[i].access_password)
268
+ assert_equal(@cache_objects[i].allow_download,objects[i].allow_download)
269
+ assert_equal(@cache_objects[i].allow_comment,objects[i].allow_comment)
270
+ assert_equal(@cache_objects[i].is_crawler,objects[i].is_crawler)
271
+ assert_equal(@cache_objects[i].inet_aton_ip,objects[i].inet_aton_ip)
272
+ assert_equal(@cache_objects[i].longitude,objects[i].longitude)
273
+ assert_equal(@cache_objects[i].latitude,objects[i].latitude)
274
+ assert_equal(@cache_objects[i].music_category,objects[i].music_category)
275
+ assert_equal(@cache_objects[i].order_num,objects[i].order_num)
276
+ assert_equal(@cache_objects[i].is_pick,objects[i].is_pick)
277
+ assert_equal(@cache_objects[i].rich_intro,objects[i].rich_intro)
278
+ assert_equal(@cache_objects[i].short_intro,objects[i].short_intro)
279
+ assert_equal(@cache_objects[i].comment_content,objects[i].comment_content)
280
+ assert_equal(@cache_objects[i].comment_id,objects[i].comment_id)
281
+ assert_equal(@cache_objects[i].dig_status,objects[i].dig_status)
282
+ assert_equal(@cache_objects[i].approved_at,objects[i].approved_at)
283
+ assert_equal(@cache_objects[i].is_deleted,objects[i].is_deleted)
284
+ assert_equal(@cache_objects[i].mp3size,objects[i].mp3size)
285
+ assert_equal(@cache_objects[i].mp3size_32,objects[i].mp3size_32)
286
+ assert_equal(@cache_objects[i].mp3size_64,objects[i].mp3size_64)
287
+ assert_equal(@cache_objects[i].waveform,objects[i].waveform)
288
+ assert_equal(@cache_objects[i].upload_id,objects[i].upload_id)
289
+ assert_equal(@cache_objects[i].updated_at,objects[i].updated_at)
290
+ assert_equal(@cache_objects[i].created_at,objects[i].created_at)
291
+ assert_equal(@cache_objects[i].source_url,objects[i].source_url)
292
+ assert_equal(@cache_objects[i].status,objects[i].status)
293
+ assert_equal(@cache_objects[i].explore_height,objects[i].explore_height)
294
+ assert_equal(@cache_objects[i].id,objects[i].id)
295
+ end
296
+ end
297
+
298
+ def test_mget_mset_benchmark
299
+ @object_cache.batch_evict @keys
300
+
301
+ times = 1000
302
+ start = Time.now
303
+ for i in 1 .. times do
304
+ @object_cache.multi_put(@cache_objects)
305
+ end
306
+ stop = Time.now
307
+ puts "#{times} times multi_put operation total use #{stop-start} seconds"
308
+
309
+ start = Time.now
310
+ for i in 1 .. times do
311
+ @object_cache.multi_get(@keys)
312
+ end
313
+ stop = Time.now
314
+ puts "#{times} times multi_get operation total use #{stop-start} seconds"
315
+ end
316
+
317
+ def teardown
318
+ super
319
+ puts "teardown"
320
+ end
321
+ end
322
+
@@ -0,0 +1,48 @@
1
+ $:.unshift File.expand_path("../../lib", __FILE__)
2
+
3
+ require "test/unit"
4
+ require "xunch"
5
+
6
+ class RBTreeTest < Test::Unit::TestCase
7
+ include Test::Unit::Assertions
8
+ def setup
9
+ super
10
+ puts "setup"
11
+ end
12
+
13
+ def test_rb_tree
14
+ tree = Xunch::RBTree.new
15
+
16
+ tree.put(1,"1")
17
+ tree.put(3,"3")
18
+ tree.put(5,"5")
19
+ tree.put(7,"7")
20
+ tree.put(9,"9")
21
+ tree.put(11,"11")
22
+ puts tree.size
23
+ # tree.p
24
+ # puts tree.get(1)
25
+ # puts tree.root.inspect
26
+ # puts tree.root.left
27
+ # puts tree.root.right
28
+ # puts tree.root.right.left
29
+ # puts tree.root.right.right
30
+ puts tree.first_node.inspect
31
+ puts tree.last_node.inspect
32
+ puts tree.ceiling_node(2).inspect
33
+ puts tree.floor_node(2).inspect
34
+ puts tree.ceiling_node(5).inspect
35
+ puts tree.floor_node(5).inspect
36
+
37
+ puts tree.lower_node(6).inspect
38
+ puts tree.higher_node(6).inspect
39
+
40
+ puts tree.lower_node(9).inspect
41
+ puts tree.higher_node(9).inspect
42
+ end
43
+
44
+ def teardown
45
+ super
46
+ puts "teardown"
47
+ end
48
+ end
@@ -0,0 +1,54 @@
1
+ require 'redis'
2
+ require 'hiredis'
3
+ require "test/unit"
4
+ require 'bigdecimal'
5
+ require 'time'
6
+
7
+ class ConsistencyhashTest < Test::Unit::TestCase
8
+ include Test::Unit::Assertions
9
+ def setup
10
+ super
11
+ puts "setup"
12
+ end
13
+
14
+ def test_consistency_hash
15
+ redis = Redis.new(:host => "192.168.1.174", :port => 6379, :password => "jredis123456", :driver => :hiredis)
16
+ redis.select 10
17
+ hash = {
18
+ "field1" => "value1",
19
+ "field2" => BigDecimal.new("1231312321.1545727"),
20
+ "field3" => Time.new.to_datetime,
21
+ "field4" => 123432432141324321432432,
22
+ "field5" => 54444.4545,
23
+ "field6" => 12313123,
24
+ # "field7" => "value7",
25
+ # "field8" => "value8",
26
+ # "field9" => "value9",
27
+ # "field10" => "value10",
28
+ # "field11" => "value11",
29
+ # "field12" => "value12",
30
+ # "field13" => "value13",
31
+ # "field14" => "value14",
32
+ # "field15" => "value15",
33
+ # "field16" => "value16",
34
+ # "field17" => "value17",
35
+ # "field18" => "value18",
36
+ # "field19" => "value19",
37
+ # "field20" => "value20",
38
+ }
39
+ start = Time.new
40
+ for i in 0 ..10000 do
41
+ redis.pipelined do
42
+ redis.mapped_hmset("key", hash)
43
+ redis.pexpire("key",10000)
44
+ end
45
+ end
46
+ stop = Time.new
47
+ puts stop - start
48
+ end
49
+
50
+ def teardown
51
+ super
52
+ puts "teardown"
53
+ end
54
+ end