0.151168)当然のごとくmemcachedが最速だろう。思いきや、そうでもない結果に。なんだこれーーーと思って調べ続けていたのですが、バインディングのgemのコードを追いかけるかぎり、どうもこれはmemcache-clientの実装が原因のよう。これは、memcache-clientの実装はpure-rubyで実装されているのに対して、TokyoCabinet/TokyoTyrantのバインディングの実装はnativeコードで実装されてあるのが原因のようです。事実、TokyoTyrantはmemcacheプロトコルを実装しているので、memcache-clientを利用してTokyoTyrantにアクセスすると両者はこんな結果になりました。0.271598)TokyoTyrantのアクセス速度は一気に遅くなりました。Ruby実装に引きづられているみたいですね。memcachedになると、いうわけで、memcachedが高速なことを確認するためにベンチマーク取ってみたのですが、実装によってはまったく異なる結果になることが分かって、なかなかおもしろかったです。今回利用したコードはgistに掲載しています。ruby前回のつづき。課題の1つに挙げてた中で、「Followした瞬間に、そのユーザの過去のTweetを自分のTLに追加できていない」というのがありましたが、こんなかんじでいいのかな。自分のTLに他人のTLを混ぜて、sortしてstoreし直し。endでも、そうしたあとにremoveしたときにまた再構築し直さないと駄目なことに気づいた。いうかremove面倒ですねぇ、どうするんだろう。泥臭く全statusを走査し直しなのか、それとも順序付Setとか使えば楽にremoveできるのかな。あと、このupdateについて、github上のRedTweetのコードもpushし直してますので、興味ある方はご確認ください。OSXにredisをインストール」で、redisを動かす環境まではできたので、せっかくなんでテスト的に何かサービスを作ってみよう、ということでTwitterクローンのRedTweetを作ってみました。RedTweetredisを使ったTwitterクローンは、PHP版のRetwisと、それをSinatraで書き直したRetwis-RBがあるのですが、サンプルコードはいくらっても世の中に少しは役立つだろうと思ってRails版で実装してみました。cloneしてscript/serverで手元の起動で確認ください、、と投げやり気味ですみません。次の項目は一通り実装しています。pushしたあとで同じ名前のサイトがあることが発覚したくらい直感でつけた名前です。目的さて、今回はまじめにTwitterクローンを作ることが目的ではなくて、実際は、次の項目を目的として実装してみました。Retwisのデザインを読んで、それに従って一通り実装してみるredisのAPIの仕様を学ぶRDBを一切使わない、NoSQLでWebサービスを作るためのノウハウを身につける結局全て似通った話になるのですが、上記のデザイン仕様書はTwitter的なサービスを作り上げることで、KVSをどのように利用すればいいのか、がかなり分かりやすく説明されてあるので、いい勉強になりました。Following/FollowerをSetで管理することで、redisの主要なAPIを網羅できたことも、redisの学習に役立ちました。同時に課題もすでに見えていて、スケーリングがどこまでできるかはまだ手元で理解できていないやっぱりActiveRecord的にラップしたライブラリは必須Followした瞬間に、そのユーザの過去のTweetを自分のTLに追加できていないなんかが今の段階で挙げられます。1.はテストデータを作ることで解決するはず。2.はやっぱりmustだなぁ、と思えるところまでははっきりした理解で、ユーザ名をIDから引くときなど毎回決まったprefixがついたkeyから探索するのは冗長すぎてやってられません。OhmというHashとObjectのマッピングライブラリもあるので、このあたりも1度使ってみたほうが良さそうだな、というところ。3.はFollowした瞬間に一定数TweetをListにLPUSHして、そのlistの中でSORTすればいいのかな??正直、SORTまだよくわかってません。まとめというわけで、課題は多いものの、redisとRailsで最低限の動作をするものは実装できました。redisの利点をもっと伸ばして理解を深めたいな、というところですね。Storage,いわゆるKVSは多くのプロダクトが乱立してなかなか違いを理解するのも難しい状況になりつつあるのですが、ここ数日はredisに注目をしています。redisとは何ぞやというと、公式サイトには次のような特徴が挙げられています。Java...などの各言語のバインディングを用意と、かなり豪華なスペックで、なんでもかかってこい!なプロダクトです。国内の利用例はまだ聴いた事無いですが、海外ではgithubやCraigslistが採用したことでここ最近有名になってきました。そんなredisの開発環境を整えてみたいと思います。redisのインストールソースコードから入れてもいいのですが、Macの場合は、MacPortsでインストール可能です。redisで、インストールされる、、はずなのですが、僕の環境だと途中で止まりました。processing.なんかlogディレクトリがないみたいなので、ディレクトリ作成してから一度アンインストールしてやりなおしてみます。redisこれで、インストールできました。/Library/LaunchDaemons/org.macports.redis.plistで、OKです。Rubyのバインディングのインストール僕は普段Rubyを使うので、Rubyのバインディングもあわせてインストールしてみることにします。gemでインストール可能です。redisredisの起動redisを起動するときは、redis-serverを実行します。/opt/local/etc/redis.confで、起動します。confの中には、起動するときのポート番号や、ディスクに書き出すタイミングや条件などの設定項目があります。(ちなみに、起動時に設定ファイルのパスを与えていますが、これはビルド時?に設定しておけば、実行時に与える必要は無いようです。MacPorts利用時もそれが可能なのかどうか?は不明です)では、実際に動作を確認してみたいとおもいます。telnetで6379に対して接続してコマンドを入力します。データを確認できます。コマンドを利用します。下記の例のlrangeの0は開始インデックス、-1は末尾の意味になります。-1*3$7polaris$8clammbon$8fishmansListの要素追加もStringの要素追加と同じでO(1)で実現できるのがredisのポイントですね。実際の細かなコマンドの仕様については、リファレンスを参照ください。ここまでざっと環境構築まで確認できたので、次回はもうすこしredisを使い倒してその結果をまとめたいと思います。ArchiveAboutこのBlogはクックパッドに勤めるWebエンジニアがLLネタや情報技術について直感で思ったことを何も考えず発信するサイトです。コメントやお問い合わせ、執筆依頼などは@ryo_katsuma宛のmention、またはメールなどでお待ちしています。