RubyからRedisを使ってみる

前回は、Redisをインストールして簡単な動作確認をしました。

今回はRubyからRedisにアクセスしてみます。

ライブラリのインストール

rubyからアクセスするためのライブラリ redis-rb を使います。
gem からインストールできます。

gem install redis

単語辞書データのストレージとしてRedisを使おうと思いますので、
辞書をRedisに登録するためのプログラムをまずは作成します。

登録する辞書は前々回に使用した NAIST辞書を使います。

辞書データはこの様なCSVデータが入っています。

笹野本,1365,1365,7069,名詞,固有名詞,地域,一般,*,*,笹野本,ササノホン,ササノホン,,
笹薮,1358,1358,4975,名詞,一般,*,*,*,*,笹薮,ササヤブ,ササヤブ,,
笹葉峰,1360,1360,7342,名詞,固有名詞,一般,*,*,*,笹葉峰,ササバミネ,ササバミネ,,
笹流山,1360,1360,7342,名詞,固有名詞,一般,*,*,*,笹流山,ササナガレヤマ,ササナガレヤマ,,
笹流貯水池,1360,1360,7342,名詞,固有名詞,一般,*,*,*,笹流貯水池,ササナガレチョスイチ,ササナガレチョスイチ,,
笹竜胆,1358,1358,4975,名詞,一般,*,*,*,*,笹竜胆,ササリンドウ,ササリンドー,,
笹林,1365,1365,7069,名詞,固有名詞,地域,一般,*,*,笹林,ササバヤシ,ササバヤシ,,
笹路,1365,1365,7069,名詞,固有名詞,地域,一般,*,*,笹路,ソソロ,ソソロ,,
笹和田,1365,1365,7069,名詞,固有名詞,地域,一般,*,*,笹和田,ササワダ,ササワダ,,
笹塒山,1360,1360,7342,名詞,固有名詞,一般,*,*,*,笹塒山,ササトヤヤマ,ササトヤヤマ,,

各列の意味はこの様になっています

表層形 左文脈ID 右文脈ID コスト 品詞 品詞細分類1 品詞細分類2 品詞細分類3 活用形 活用型 原形 読み 発音
笹野本 1365 1365 7069 名詞 固有名詞 地域 一般 笹野本 ササノホン ササノホン
笹竜胆 1358 1358 4975 名詞 一般 笹竜胆 ササリンドウ ササリンドー

今回は単語とその読みを登録するものとし記号以外の品詞の単語を登録します。また読みと発音が異なる場合はそれぞれ登録することにします。
で登録するためのプログラムはこの様になります。

# coding:utf-8
require 'redis'

unless ARGV.length==1 then
  p "Usage: setup_dict_redis.rb filename"
  exit 1
end

redis = Redis.new
redis.ping
redis.flushdb

filename=ARGV[0]
File.foreach(filename) do |line|
  fields = line.split(",")
  unless /記号/ =~ fields[4] then
     redis.set "#{fields[11]}","#{fields[0]}"
     redis.set "#{fields[12]}","#{fields[0]}" if fields[11] != fields[12]
  end
end

redis.save
info = redis.info
p info["db0"]
redis.quit

実行してみます。

$ wc -l naist-jdic-utf.csv 
485863 naist-jdic-utf.csv

$ time ruby setup_dict_redis.rb naist-jdic-utf.csv
"keys=250490,expires=0"
ruby setup_dict_redis.rb naist-jdic-utf.csv  31.40s user 6.52s system 97% cpu 38.836 total

元の辞書の単語数は485863語で、これから記号を除いています。
また上記のプログラムでは文字列型で登録しています。読みがキーになっているため同じ読みのものは後からの単語で上書きされます。
このためRedisに登録された単語数は 250490語になります。
この単語の登録が31.40sと言うことなのでめちゃくちゃ早いですね。

またRedisは永続化できるので先ほどのプログラムの最後でファイルに書き出しました。
データのファイルサイズがどれくらいかというと

$ ls -l /var/lib/redis/6379/
合計 7808
-rw-r--r-- 1 root root 7994150 1129 23:29 dump.rdb

約8Mといったところです。

Redisで扱うことのできるデータ型は文字列型の他にリスト型、セット型、ソート済みセット型、ハッシュ型などがあります。

Redisについての詳しい説明は、下記を参照するとよいと思います。
redisドキュメント日本語訳 — redis 2.0.3 documentation
ニコニコ生放送に見る Redis 活用ノウハウ|gihyo.jp … 技術評論社
redis、それは危険なほどのスピード|サイバーエージェント 公式エンジニアブログ