rubyでredisを使ってみる

先日の記事で、redis を使ってみるを書いたのだけど、ruby からの使い方がわかったので、まとめておきたい。

目次

実行環境

  • windows
    • Windows10 ver.1909
  • Mac
    • macOS Mojave 10.14.4

参考

準備

以下の手順で、環境準備を行う。

1
2
3
4
5
6
bundle init

# gem "redis" を Gemfile に追記

bundle install --path=vender/bundle

最低限の動作確認

実装 1

sample.rb を作成します。

sample.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
require "redis"

redis = Redis.new

# まだ設定していないので、nilが返ってくる
puts redis.get "key"
# クラスを確認
puts redis.get("key").class

# keyとvalueを設定
redis.set "key", "value"

# 値を設定したので、"value"が返ってくる
puts redis.get "key"

確認 1

以下のコマンドを実行します。

1
bundle exec ruby sumple.rb

実行結果は、以下の通りです。

1
2
3

NilClass
value

もう 1 回実行すると設定済みなので、”value”が帰ってきます。もちろん String クラスです。

1
2
3
value
String
value

最低限の動作を確認できました。

node.js では見かけなかった処理

おそらく、node.js で redis を使うときには見かけなかった「Pipelining」の記述を見つけたので、試してみる。
Pipelining を使うと高速化できるということなので、
100 回値の設定をする処理を 10 回繰り返し時間を計測してみます。

実装 2

redis.pipelined を使うsample2-A.rbを作成します。

sample2-A.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
require 'benchmark'
require "redis"

redis = Redis.new
result = Float(0)

10.times do
result += Benchmark.realtime do
redis.pipelined do
redis.set "key", "value"
# 省略 全部で100回のredis.set "key", "value"
redis.set "key", "value"
end
end
end
puts "経過時間 #{result/10}s"

redis.pipelined を使わないsample2-B.rbを作成します。

sample2-B.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
require 'benchmark'
require "redis"

redis = Redis.new
result = Float(0)

10.times do
result += Benchmark.realtime do
redis.set "key", "value"
# 省略 全部で100回のredis.set "key", "value"
redis.set "key", "value"
end
puts result.class
end
puts "経過時間 #{result/10}s"

確認 2

sample2-A.rb``sample2-B.rbのそれぞれを実行し、処理時間を比較します。

1
2
3
4
5
bundle exec ruby sumple2-A.rb
>経過時間 0.0017285300011280925s

bundle exec ruby sumple2-B.rb
>経過時間 0.024716679996345192s

redis.pipelinedを使った場合、には約 0.002 秒で済んだ処理が、約 0.025 秒かかってしまいました。
確かに redis.pipelined を用いることで高速化を図ることができました。
ただし、github - redis-rbの説明では、「処理に依存関係がないとき」という記述があるので、注意が必要そうです。


今回は、redis を ruby から扱ってみました。
redis.pipelinedでの速度比較は、10 倍以上の差が出たことには、結構驚きました。
実装方法次第で、高速化できる点は心にとめておきたいとことでした。
次は rails への redis を導入を試す予定です。

ではでは。