Mac OSXにredisをインストール

2010.03.22 / kvs ruby

Tokyo Cabinet / Tokyo Tyrantに代表されるKey-Value Storage,いわゆるKVSは多くのプロダクトが乱立してなかなか違いを理解するのも難しい状況になりつつあるのですが、ここ数日はredisに注目をしています。redisとは何ぞやというと、公式サイトには次のような特徴が挙げられています。

  • memcachedのようないわゆるKVS
  • valueにはStringだけではなく、List, Setも利用できる
  • データに対するpush/pop, add/removeのような操作はすべてatomicな操作
  • 通常はメモリ上で動作するが、定期的にデータをディスクに書き出す(常に書き出すような設定も可能)
  • Master-Slaveのレプしケーションをサポート
  • Ruby, Python, Perl, Java…などの各言語のバインディングを用意

と、かなり豪華なスペックで、なんでもかかってこい!なプロダクトです。国内の利用例はまだ聴いた事無いですが、海外ではgithubやCraigslistが採用したことでここ最近有名になってきました。

さて、そんなredisの開発環境を整えてみたいと思います。環境はMac OSX 10.5。

redisのインストール

ソースコードから入れてもいいのですが、Macの場合は、MacPortsでインストール可能です。

  $sudo port -d sync
  

で、インストールリストを最新の状態にしておいて

  $sudo port install redis
  

で、インストールされる、、はずなのですが、僕の環境だと途中で止まりました。

  $ sudo port install redis
  --->  Fetching redis
  --->  Attempting to fetch redis-1.2.2.tar.gz from http://redis.googlecode.com/files/
  --->  Verifying checksum(s) for redis
  --->  Extracting redis
  --->  Configuring redis
  --->  Building redis
  --->  Staging redis into destroot
  --->  Creating launchd control script
  ###########################################################
  # A startup item has been generated that will aid in
  # starting redis with launchd. It is disabled
  # by default. Execute the following command to start it,
  # and to cause it to launch at startup:
  #
  # sudo launchctl load -w /Library/LaunchDaemons/org.macports.redis.plist
  ###########################################################
  --->  Installing redis @1.2.2_0
  --->  Activating redis @1.2.2_0
  Error: Target org.macports.activate returned: couldn't open "/opt/local/var/log/redis.log": no such file or directory
  Error: Status 1 encountered during processing.
  

なんかlogディレクトリがないみたいなので、ディレクトリ作成してから一度アンインストールしてやりなおしてみます。

  $ sudo mkdir /opt/local/var/log
  $ sudo port uninstall redis
  $ sudo port install redis
  ==================================================================
  * To start up a redis server instance use this command:
  * 
  *   redis-server /opt/local/etc/redis.conf
  * 
  ==================================================================
  
  --->  Cleaning redis
  
  

これで、インストールできました。サービスに登録したい場合は、途中のログに書いてあるとおり、

  sudo launchctl load -w /Library/LaunchDaemons/org.macports.redis.plist
  

で、OKです。

Rubyのバインディングのインストール

僕は普段Rubyを使うので、Rubyのバインディングもあわせてインストールしてみることにします。gemでインストール可能です。

  sudo gem install redis
  

redisの起動

redisを起動するときは、redis-serverを実行します。MacPortsでインストールした場合、/opt/local/bin にバイナリがインストールされてあるので

  sudo /opt/local/bin/redis-server /opt/local/etc/redis.conf
  

で、起動します。confの中には、起動するときのポート番号や、ディスクに書き出すタイミングや条件などの設定項目があります。(ちなみに、起動時に設定ファイルのパスを与えていますが、これはビルド時?に設定しておけば、実行時に与える必要は無いようです。ただ、MacPorts利用時もそれが可能なのかどうか?は不明です)

では、実際に動作を確認してみたいとおもいます。確認するときは、redis-serverと同じ場所にあるredis-cli, またはtelnetで6379に対して接続してコマンドを入力します。(今回はtelnetで接続して生のコマンドを叩いて確認してみます)ValueをStringとして扱うときは、 set \r\nでデータをセット, get でデータを確認できます。

  set foo 3
  bar
  +OK
  
  get foo
  $3
  bar
  

listとして扱うときは、lpush \r\n, lrange などのコマンドを利用します。下記の例のlrangeの0は開始インデックス、-1は末尾の意味になります。

  lpush artists 8
  fishmans
  +OK
  
  lpush artists 9
  clammbon
  +OK
  
  lpush artists 7
  polaris
  +OK
  
  lrange artists 0 -1
  *3
  $7
  polaris
  $8
  clammbon
  $8
  fishmans
  

Listの要素追加もStringの要素追加と同じでO(1)で実現できるのがredisのポイントですね。実際の細かなコマンドの仕様については、リファレンスを参照ください。

ここまでざっと環境構築まで確認できたので、次回はもうすこしredisを使い倒してその結果をまとめたいと思います。