redis 3.0.0 → 4.5.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (106) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +315 -0
  3. data/README.md +301 -58
  4. data/lib/redis/client.rb +383 -88
  5. data/lib/redis/cluster/command.rb +81 -0
  6. data/lib/redis/cluster/command_loader.rb +33 -0
  7. data/lib/redis/cluster/key_slot_converter.rb +72 -0
  8. data/lib/redis/cluster/node.rb +108 -0
  9. data/lib/redis/cluster/node_key.rb +31 -0
  10. data/lib/redis/cluster/node_loader.rb +37 -0
  11. data/lib/redis/cluster/option.rb +93 -0
  12. data/lib/redis/cluster/slot.rb +86 -0
  13. data/lib/redis/cluster/slot_loader.rb +49 -0
  14. data/lib/redis/cluster.rb +291 -0
  15. data/lib/redis/connection/command_helper.rb +7 -10
  16. data/lib/redis/connection/hiredis.rb +12 -8
  17. data/lib/redis/connection/registry.rb +2 -1
  18. data/lib/redis/connection/ruby.rb +266 -74
  19. data/lib/redis/connection/synchrony.rb +41 -14
  20. data/lib/redis/connection.rb +4 -2
  21. data/lib/redis/distributed.rb +258 -76
  22. data/lib/redis/errors.rb +48 -0
  23. data/lib/redis/hash_ring.rb +31 -73
  24. data/lib/redis/pipeline.rb +74 -18
  25. data/lib/redis/subscribe.rb +24 -13
  26. data/lib/redis/version.rb +3 -1
  27. data/lib/redis.rb +2068 -464
  28. metadata +63 -160
  29. data/.gitignore +0 -10
  30. data/.order +0 -169
  31. data/.travis/Gemfile +0 -11
  32. data/.travis.yml +0 -50
  33. data/.yardopts +0 -3
  34. data/Rakefile +0 -392
  35. data/benchmarking/logging.rb +0 -62
  36. data/benchmarking/pipeline.rb +0 -51
  37. data/benchmarking/speed.rb +0 -21
  38. data/benchmarking/suite.rb +0 -24
  39. data/benchmarking/worker.rb +0 -71
  40. data/examples/basic.rb +0 -15
  41. data/examples/dist_redis.rb +0 -43
  42. data/examples/incr-decr.rb +0 -17
  43. data/examples/list.rb +0 -26
  44. data/examples/pubsub.rb +0 -31
  45. data/examples/sets.rb +0 -36
  46. data/examples/unicorn/config.ru +0 -3
  47. data/examples/unicorn/unicorn.rb +0 -20
  48. data/redis.gemspec +0 -41
  49. data/test/blocking_commands_test.rb +0 -42
  50. data/test/command_map_test.rb +0 -30
  51. data/test/commands_on_hashes_test.rb +0 -21
  52. data/test/commands_on_lists_test.rb +0 -20
  53. data/test/commands_on_sets_test.rb +0 -77
  54. data/test/commands_on_sorted_sets_test.rb +0 -109
  55. data/test/commands_on_strings_test.rb +0 -83
  56. data/test/commands_on_value_types_test.rb +0 -99
  57. data/test/connection_handling_test.rb +0 -189
  58. data/test/db/.gitignore +0 -1
  59. data/test/distributed_blocking_commands_test.rb +0 -46
  60. data/test/distributed_commands_on_hashes_test.rb +0 -10
  61. data/test/distributed_commands_on_lists_test.rb +0 -22
  62. data/test/distributed_commands_on_sets_test.rb +0 -83
  63. data/test/distributed_commands_on_sorted_sets_test.rb +0 -18
  64. data/test/distributed_commands_on_strings_test.rb +0 -48
  65. data/test/distributed_commands_on_value_types_test.rb +0 -87
  66. data/test/distributed_commands_requiring_clustering_test.rb +0 -148
  67. data/test/distributed_connection_handling_test.rb +0 -23
  68. data/test/distributed_internals_test.rb +0 -15
  69. data/test/distributed_key_tags_test.rb +0 -52
  70. data/test/distributed_persistence_control_commands_test.rb +0 -26
  71. data/test/distributed_publish_subscribe_test.rb +0 -92
  72. data/test/distributed_remote_server_control_commands_test.rb +0 -53
  73. data/test/distributed_scripting_test.rb +0 -102
  74. data/test/distributed_sorting_test.rb +0 -20
  75. data/test/distributed_test.rb +0 -58
  76. data/test/distributed_transactions_test.rb +0 -32
  77. data/test/encoding_test.rb +0 -18
  78. data/test/error_replies_test.rb +0 -59
  79. data/test/helper.rb +0 -188
  80. data/test/helper_test.rb +0 -22
  81. data/test/internals_test.rb +0 -214
  82. data/test/lint/blocking_commands.rb +0 -124
  83. data/test/lint/hashes.rb +0 -162
  84. data/test/lint/lists.rb +0 -143
  85. data/test/lint/sets.rb +0 -96
  86. data/test/lint/sorted_sets.rb +0 -201
  87. data/test/lint/strings.rb +0 -157
  88. data/test/lint/value_types.rb +0 -106
  89. data/test/persistence_control_commands_test.rb +0 -26
  90. data/test/pipelining_commands_test.rb +0 -195
  91. data/test/publish_subscribe_test.rb +0 -153
  92. data/test/remote_server_control_commands_test.rb +0 -104
  93. data/test/scripting_test.rb +0 -78
  94. data/test/sorting_test.rb +0 -45
  95. data/test/support/connection/hiredis.rb +0 -1
  96. data/test/support/connection/ruby.rb +0 -1
  97. data/test/support/connection/synchrony.rb +0 -17
  98. data/test/support/redis_mock.rb +0 -92
  99. data/test/support/wire/synchrony.rb +0 -24
  100. data/test/support/wire/thread.rb +0 -5
  101. data/test/synchrony_driver.rb +0 -57
  102. data/test/test.conf +0 -9
  103. data/test/thread_safety_test.rb +0 -32
  104. data/test/transactions_test.rb +0 -244
  105. data/test/unknown_commands_test.rb +0 -14
  106. data/test/url_param_test.rb +0 -64
data/Rakefile DELETED
@@ -1,392 +0,0 @@
1
- require 'rubygems'
2
- require 'rubygems/package_task'
3
- require 'rake/testtask'
4
-
5
- $:.unshift File.join(File.dirname(__FILE__), 'lib')
6
- require 'redis/version'
7
-
8
- REDIS_DIR = File.expand_path(File.join("..", "test"), __FILE__)
9
- REDIS_CNF = File.join(REDIS_DIR, "test.conf")
10
- REDIS_PID = File.join(REDIS_DIR, "db", "redis.pid")
11
-
12
- task :default => :run
13
-
14
- desc "Run tests and manage server start/stop"
15
- task :run => [:start, :test, :stop]
16
-
17
- desc "Start the Redis server"
18
- task :start do
19
- redis_running = \
20
- begin
21
- File.exists?(REDIS_PID) && Process.kill(0, File.read(REDIS_PID).to_i)
22
- rescue Errno::ESRCH
23
- FileUtils.rm REDIS_PID
24
- false
25
- end
26
-
27
- unless redis_running
28
- unless system("which redis-server")
29
- STDERR.puts "redis-server not in PATH"
30
- exit 1
31
- end
32
-
33
- unless system("redis-server #{REDIS_CNF}")
34
- STDERR.puts "could not start redis-server"
35
- exit 1
36
- end
37
- end
38
- end
39
-
40
- desc "Stop the Redis server"
41
- task :stop do
42
- if File.exists?(REDIS_PID)
43
- Process.kill "INT", File.read(REDIS_PID).to_i
44
- FileUtils.rm REDIS_PID
45
- end
46
- end
47
-
48
- Rake::TestTask.new do |t|
49
- t.options = "-v"
50
- t.libs << "test"
51
- t.test_files = FileList["test/*_test.rb"]
52
- end
53
-
54
- task :doc => ["doc:generate", "doc:prepare"]
55
-
56
- namespace :doc do
57
- task :generate do
58
- require "shellwords"
59
-
60
- `rm -rf doc`
61
-
62
- current_branch = `git branch`[/^\* (.*)$/, 1]
63
-
64
- begin
65
- tags = `git tag -l`.split("\n").sort.reverse
66
-
67
- tags.each do |tag|
68
- `git checkout -q #{tag} 2>/dev/null`
69
-
70
- unless $?.success?
71
- $stderr.puts "Need a clean working copy. Please git-stash away."
72
- exit 1
73
- end
74
-
75
- puts tag
76
-
77
- `mkdir -p doc/#{tag}`
78
-
79
- files = `git ls-tree -r HEAD lib`.split("\n").map do |line|
80
- line[/\t(.*)$/, 1]
81
- end
82
-
83
- opts = [
84
- "--title", "A Ruby client for Redis",
85
- "--output", "doc/#{tag}",
86
- "--no-cache",
87
- "--no-save",
88
- "-q",
89
- *files
90
- ]
91
-
92
- `yardoc #{Shellwords.shelljoin opts}`
93
- end
94
- ensure
95
- `git checkout -q #{current_branch}`
96
- end
97
- end
98
-
99
- task :prepare do
100
- versions = `git tag -l`.split("\n").grep(/^v/).sort
101
- latest_version = versions.last
102
-
103
- File.open("doc/.htaccess", "w") do |file|
104
- file.puts "RedirectMatch 302 ^/?$ /#{latest_version}"
105
- end
106
-
107
- File.open("doc/robots.txt", "w") do |file|
108
- file.puts "User-Agent: *"
109
-
110
- (versions - [latest_version]).each do |version|
111
- file.puts "Disallow: /#{version}"
112
- end
113
- end
114
-
115
- google_analytics = <<-EOS
116
- <script type="text/javascript">
117
-
118
- var _gaq = _gaq || [];
119
- _gaq.push(['_setAccount', 'UA-11356145-2']);
120
- _gaq.push(['_trackPageview']);
121
-
122
- (function() {
123
- var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
124
- ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
125
- var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
126
- })();
127
-
128
- </script>
129
- EOS
130
-
131
- Dir["doc/**/*.html"].each do |path|
132
- lines = IO.readlines(path)
133
-
134
- File.open(path, "w") do |file|
135
- lines.each do |line|
136
- if line.include?("</head>")
137
- file.write(google_analytics)
138
- end
139
-
140
- file.write(line)
141
- end
142
- end
143
- end
144
- end
145
-
146
- task :deploy do
147
- system "rsync --del -avz doc/ redis-rb.keyvalue.org:deploys/redis-rb.keyvalue.org/"
148
- end
149
- end
150
-
151
- class Source
152
-
153
- MATCHER = "(?:\\s{%d}#[^\\n]*\\n)*^\\s{%d}def ([a-z_?]+)(?:\(.*?\))?\\n.*?^\\s{%d}end\\n\\n"
154
-
155
- def initialize(data, options = {})
156
- @doc = parse(File.read(data), options)
157
- end
158
-
159
- def methods
160
- @doc.select do |d|
161
- d.is_a?(Method)
162
- end.map do |d|
163
- d.name
164
- end
165
- end
166
-
167
- def move(a, b)
168
- ao = @doc.find { |m| m.is_a?(Method) && m.name == a }
169
- bo = @doc.find { |m| m.is_a?(Method) && m.name == b }
170
- ai = @doc.index(ao)
171
- bi = @doc.index(bo)
172
-
173
- @doc.delete_at(ai)
174
- @doc.insert(bi, ao)
175
-
176
- nil
177
- end
178
-
179
- def to_s
180
- @doc.join
181
- end
182
-
183
- protected
184
-
185
- def parse(data, options = {})
186
- re = Regexp.new(MATCHER % ([options[:indent]] * 3), Regexp::MULTILINE)
187
- tail = data.dup
188
- doc = []
189
-
190
- while match = re.match(tail)
191
- doc << match.pre_match
192
- doc << Method.new(match)
193
- tail = match.post_match
194
- end
195
-
196
- doc << tail if tail
197
- doc
198
- end
199
-
200
- class Method
201
-
202
- def initialize(match)
203
- @match = match
204
- end
205
-
206
- def name
207
- @match[1]
208
- end
209
-
210
- def to_s
211
- @match[0]
212
- end
213
- end
214
- end
215
-
216
- namespace :commands do
217
- def redis_commands
218
- $redis_commands ||= doc.keys.map do |key|
219
- key.split(" ").first.downcase
220
- end.uniq
221
- end
222
-
223
- def doc
224
- $doc ||= begin
225
- require "open-uri"
226
- require "json"
227
-
228
- JSON.parse(open("https://github.com/antirez/redis-doc/raw/master/commands.json").read)
229
- end
230
- end
231
-
232
- task :order do
233
- require "json"
234
-
235
- reference = if File.exist?(".order")
236
- JSON.parse(File.read(".order"))
237
- else
238
- {}
239
- end
240
-
241
- buckets = {}
242
- doc.each do |k, v|
243
- buckets[v["group"]] ||= []
244
- buckets[v["group"]] << k.split.first.downcase
245
- buckets[v["group"]].uniq!
246
- end
247
-
248
- result = (reference.keys + (buckets.keys - reference.keys)).map do |g|
249
- [g, reference[g] + (buckets[g] - reference[g])]
250
- end
251
-
252
- File.open(".order", "w") do |f|
253
- f.write(JSON.pretty_generate(Hash[result]))
254
- end
255
- end
256
-
257
- def reorder(file, options = {})
258
- require "json"
259
- require "set"
260
-
261
- STDERR.puts "reordering #{file}..."
262
-
263
- reference = if File.exist?(".order")
264
- JSON.parse(File.read(".order"))
265
- else
266
- {}
267
- end
268
-
269
- dst = Source.new(file, options)
270
-
271
- src_methods = reference.map { |k, v| v }.flatten
272
- dst_methods = dst.methods
273
-
274
- src_set = Set.new(src_methods)
275
- dst_set = Set.new(dst_methods)
276
-
277
- intersection = src_set & dst_set
278
- intersection.delete("initialize")
279
-
280
- loop do
281
- src_methods = reference.map { |k, v| v }.flatten
282
- dst_methods = dst.methods
283
-
284
- src_methods = src_methods.select do |m|
285
- intersection.include?(m)
286
- end
287
-
288
- dst_methods = dst_methods.select do |m|
289
- intersection.include?(m)
290
- end
291
-
292
- if src_methods == dst_methods
293
- break
294
- end
295
-
296
- rv = yield(src_methods, dst_methods, dst)
297
- break if rv == false
298
- end
299
-
300
- File.open(file, "w") do |f|
301
- f.write(dst.to_s)
302
- end
303
- end
304
-
305
- task :reorder do
306
- blk = lambda do |src_methods, dst_methods, dst|
307
- src_methods.zip(dst_methods).each do |a, b|
308
- if a != b
309
- dst.move(a, b)
310
- break
311
- end
312
- end
313
- end
314
-
315
- reorder "lib/redis.rb", :indent => 2, &blk
316
- reorder "lib/redis/distributed.rb", :indent => 4, &blk
317
- end
318
-
319
- def missing(file, options = {})
320
- src = Source.new(file, options)
321
-
322
- defined_methods = src.methods.map(&:downcase)
323
- required_methods = redis_commands.map(&:downcase)
324
-
325
- STDOUT.puts "missing in #{file}:"
326
- STDOUT.puts (required_methods - defined_methods).inspect
327
- end
328
-
329
- task :missing do
330
- missing "lib/redis.rb", :indent => 2
331
- missing "lib/redis/distributed.rb", :indent => 4
332
- end
333
-
334
- def document(file)
335
- source = File.read(file)
336
-
337
- doc.each do |name, command|
338
- source.sub!(/(?:^ *# .*\n)*(^ *#\n(^ *# .+?\n)*)*^( *)def #{name.downcase}(\(|$)/) do
339
- extra_comments, indent, extra_args = $1, $3, $4
340
- comment = "#{indent}# #{command["summary"].strip}."
341
-
342
- IO.popen("par p#{2 + indent.size} 80", "r+") do |io|
343
- io.puts comment
344
- io.close_write
345
- comment = io.read
346
- end
347
-
348
- "#{comment}#{extra_comments}#{indent}def #{name.downcase}#{extra_args}"
349
- end
350
- end
351
-
352
- File.open(file, "w") { |f| f.write(source) }
353
- end
354
-
355
- task :doc do
356
- document "lib/redis.rb"
357
- document "lib/redis/distributed.rb"
358
- end
359
-
360
- task :verify do
361
- require "redis"
362
- require "stringio"
363
-
364
- require "./test/helper"
365
-
366
- OPTIONS[:logger] = Logger.new("./tmp/log")
367
-
368
- Rake::Task["test:ruby"].invoke
369
-
370
- redis = Redis.new
371
-
372
- report = ["Command", "\033[0mDefined?\033[0m", "\033[0mTested?\033[0m"]
373
-
374
- yes, no = "\033[1;32mYes\033[0m", "\033[1;31mNo\033[0m"
375
-
376
- log = File.read("./tmp/log")
377
-
378
- redis_commands.sort.each do |name, _|
379
- defined, tested = redis.respond_to?(name), log[">> #{name.upcase}"]
380
-
381
- next if defined && tested
382
-
383
- report << name
384
- report << (defined ? yes : no)
385
- report << (tested ? yes : no)
386
- end
387
-
388
- IO.popen("rs 0 3", "w") do |io|
389
- io.puts report.join("\n")
390
- end
391
- end
392
- end
@@ -1,62 +0,0 @@
1
- # Run with
2
- #
3
- # $ ruby -Ilib benchmarking/logging.rb
4
- #
5
-
6
- begin
7
- require "bench"
8
- rescue LoadError
9
- $stderr.puts "`gem install bench` and try again."
10
- exit 1
11
- end
12
-
13
- require "redis"
14
- require "logger"
15
-
16
- def log(level, namespace = nil)
17
- logger = (namespace || Kernel).const_get(:Logger).new("/dev/null")
18
- logger.level = (namespace || Logger).const_get(level)
19
- logger
20
- end
21
-
22
- def stress(redis)
23
- redis.flushdb
24
-
25
- n = (ARGV.shift || 2000).to_i
26
-
27
- n.times do |i|
28
- key = "foo:#{i}"
29
- redis.set key, i
30
- redis.get key
31
- end
32
- end
33
-
34
- default = Redis.new
35
-
36
- logging_redises = [
37
- Redis.new(:logger => log(:DEBUG)),
38
- Redis.new(:logger => log(:INFO)),
39
- ]
40
-
41
- begin
42
- require "log4r"
43
-
44
- logging_redises += [
45
- Redis.new(:logger => log(:DEBUG, Log4r)),
46
- Redis.new(:logger => log(:INFO, Log4r)),
47
- ]
48
- rescue LoadError
49
- $stderr.puts "Log4r not installed. `gem install log4r` if you want to compare it against Ruby's Logger (spoiler: it's much faster)."
50
- end
51
-
52
- benchmark "Default options (no logger)" do
53
- stress(default)
54
- end
55
-
56
- logging_redises.each do |redis|
57
- benchmark "#{redis.client.logger.class} on #{Logger::SEV_LABEL[redis.client.logger.level]}" do
58
- stress(redis)
59
- end
60
- end
61
-
62
- run 10
@@ -1,51 +0,0 @@
1
- require "benchmark"
2
-
3
- $:.push File.join(File.dirname(__FILE__), 'lib')
4
-
5
- require 'redis'
6
-
7
- ITERATIONS = 10000
8
-
9
- @r = Redis.new
10
-
11
- Benchmark.bmbm do |benchmark|
12
- benchmark.report("set") do
13
- @r.flushdb
14
-
15
- ITERATIONS.times do |i|
16
- @r.set("foo#{i}", "Hello world!")
17
- @r.get("foo#{i}")
18
- end
19
- end
20
-
21
- benchmark.report("set (pipelined)") do
22
- @r.flushdb
23
-
24
- @r.pipelined do
25
- ITERATIONS.times do |i|
26
- @r.set("foo#{i}", "Hello world!")
27
- @r.get("foo#{i}")
28
- end
29
- end
30
- end
31
-
32
- benchmark.report("lpush+ltrim") do
33
- @r.flushdb
34
-
35
- ITERATIONS.times do |i|
36
- @r.lpush "lpush#{i}", i
37
- @r.ltrim "ltrim#{i}", 0, 30
38
- end
39
- end
40
-
41
- benchmark.report("lpush+ltrim (pipelined)") do
42
- @r.flushdb
43
-
44
- @r.pipelined do
45
- ITERATIONS.times do |i|
46
- @r.lpush "lpush#{i}", i
47
- @r.ltrim "ltrim#{i}", 0, 30
48
- end
49
- end
50
- end
51
- end
@@ -1,21 +0,0 @@
1
- # Run with
2
- #
3
- # $ ruby -Ilib benchmarking/speed.rb
4
- #
5
-
6
- require "benchmark"
7
- require "redis"
8
-
9
- r = Redis.new
10
- n = (ARGV.shift || 20000).to_i
11
-
12
- elapsed = Benchmark.realtime do
13
- # n sets, n gets
14
- n.times do |i|
15
- key = "foo#{i}"
16
- r[key] = key * 10
17
- r[key]
18
- end
19
- end
20
-
21
- puts '%.2f Kops' % (2 * n / 1000 / elapsed)
@@ -1,24 +0,0 @@
1
- require 'fileutils'
2
-
3
- def run_in_background(command)
4
- fork { system command }
5
- end
6
-
7
- def with_all_segments(&block)
8
- 0.upto(9) do |segment_number|
9
- block_size = 100000
10
- start_index = segment_number * block_size
11
- end_index = start_index + block_size - 1
12
- block.call(start_index, end_index)
13
- end
14
- end
15
-
16
- #with_all_segments do |start_index, end_index|
17
- # puts "Initializing keys from #{start_index} to #{end_index}"
18
- # system "ruby worker.rb initialize #{start_index} #{end_index} 0"
19
- #end
20
-
21
- with_all_segments do |start_index, end_index|
22
- run_in_background "ruby worker.rb write #{start_index} #{end_index} 10"
23
- run_in_background "ruby worker.rb read #{start_index} #{end_index} 1"
24
- end
@@ -1,71 +0,0 @@
1
- BENCHMARK_ROOT = File.dirname(__FILE__)
2
- REDIS_ROOT = File.join(BENCHMARK_ROOT, "..", "lib")
3
-
4
- $: << REDIS_ROOT
5
- require 'redis'
6
- require 'benchmark'
7
-
8
- def show_usage
9
- puts <<-EOL
10
- Usage: worker.rb [read:write] <start_index> <end_index> <sleep_msec>
11
- EOL
12
- end
13
-
14
- def shift_from_argv
15
- value = ARGV.shift
16
- unless value
17
- show_usage
18
- exit -1
19
- end
20
- value
21
- end
22
-
23
- operation = shift_from_argv.to_sym
24
- start_index = shift_from_argv.to_i
25
- end_index = shift_from_argv.to_i
26
- sleep_msec = shift_from_argv.to_i
27
- sleep_duration = sleep_msec/1000.0
28
-
29
- redis = Redis.new
30
-
31
- case operation
32
- when :initialize
33
-
34
- start_index.upto(end_index) do |i|
35
- redis[i] = 0
36
- end
37
-
38
- when :clear
39
-
40
- start_index.upto(end_index) do |i|
41
- redis.delete(i)
42
- end
43
-
44
- when :read, :write
45
-
46
- puts "Starting to #{operation} at segment #{end_index + 1}"
47
-
48
- loop do
49
- t1 = Time.now
50
- start_index.upto(end_index) do |i|
51
- case operation
52
- when :read
53
- redis.get(i)
54
- when :write
55
- redis.incr(i)
56
- else
57
- raise "Unknown operation: #{operation}"
58
- end
59
- sleep sleep_duration
60
- end
61
- t2 = Time.now
62
-
63
- requests_processed = end_index - start_index
64
- time = t2 - t1
65
- puts "#{t2.strftime("%H:%M")} [segment #{end_index + 1}] : Processed #{requests_processed} requests in #{time} seconds - #{(requests_processed/time).round} requests/sec"
66
- end
67
-
68
- else
69
- raise "Unknown operation: #{operation}"
70
- end
71
-
data/examples/basic.rb DELETED
@@ -1,15 +0,0 @@
1
- require 'redis'
2
-
3
- r = Redis.new
4
-
5
- r.del('foo')
6
-
7
- puts
8
-
9
- p'set foo to "bar"'
10
- r['foo'] = 'bar'
11
-
12
- puts
13
-
14
- p 'value of foo'
15
- p r['foo']
@@ -1,43 +0,0 @@
1
- require "redis"
2
- require "redis/distributed"
3
-
4
- r = Redis::Distributed.new %w[redis://localhost:6379 redis://localhost:6380 redis://localhost:6381 redis://localhost:6382]
5
-
6
- r.flushdb
7
-
8
- r['urmom'] = 'urmom'
9
- r['urdad'] = 'urdad'
10
- r['urmom1'] = 'urmom1'
11
- r['urdad1'] = 'urdad1'
12
- r['urmom2'] = 'urmom2'
13
- r['urdad2'] = 'urdad2'
14
- r['urmom3'] = 'urmom3'
15
- r['urdad3'] = 'urdad3'
16
- p r['urmom']
17
- p r['urdad']
18
- p r['urmom1']
19
- p r['urdad1']
20
- p r['urmom2']
21
- p r['urdad2']
22
- p r['urmom3']
23
- p r['urdad3']
24
-
25
- r.rpush 'listor', 'foo1'
26
- r.rpush 'listor', 'foo2'
27
- r.rpush 'listor', 'foo3'
28
- r.rpush 'listor', 'foo4'
29
- r.rpush 'listor', 'foo5'
30
-
31
- p r.rpop('listor')
32
- p r.rpop('listor')
33
- p r.rpop('listor')
34
- p r.rpop('listor')
35
- p r.rpop('listor')
36
-
37
- puts "key distribution:"
38
-
39
- r.ring.nodes.each do |node|
40
- p [node.client, node.keys("*")]
41
- end
42
- r.flushdb
43
- p r.keys('*')
@@ -1,17 +0,0 @@
1
- require 'redis'
2
-
3
- r = Redis.new
4
-
5
- puts
6
- p 'incr'
7
- r.del 'counter'
8
-
9
- p r.incr('counter')
10
- p r.incr('counter')
11
- p r.incr('counter')
12
-
13
- puts
14
- p 'decr'
15
- p r.decr('counter')
16
- p r.decr('counter')
17
- p r.decr('counter')