2013-03-26

redisのデータ型の概要と利用例まとめ











RDBMSの代替としてredisを使うことになり、DB設計する上で考慮すべき型の概要と利用法をまとめる。
間違いやもっと良い使い方があれば教えてください^^


■String - 文字列型

・概要

1つのkeyに対して1GBまでの文字列を1つ持つことが出来る。基本。

・使いどころ

JPEGイメージ、シリアライズされたオブジェクト情報など単体で持つ時。
(他の型の基本になってるので、これ単体で使うと言うより応用する感じ?単体で十分なとき等で使う?)



■List - リスト型

・概要

文字列型のリスト。値を追加した順序が保持される。値は重複OK!
リスト前後からの出し入れ、リストの範囲指定での取り出し等の操作ができる。


・使いどころ

時刻または日付を保持するような情報。TwitterのTLの様な追加順に並ぶ一連のデータ。
要素の追加削除がリストの先頭や末尾(そうでない場合は適さない)に高頻度に発生する情報。追加順・時系列順のデータはリスト型に適している。


■Set - セット型

・概要

文字列型のセット。順番を持たないデータの集合。
重複の無い値、または重複をチェックする必要の無い値を格納するのに適している。
セットの検索、セット同士の比較、結合が出来る。

・使いどころ

集合計算を行うような集合した情報。タグ検索が有名。カテゴリに対するユーザーの属性集計などにも使える。



■Sorted set - ソート済みセット型

・概要

setの各要素にソート用の値(Score)を付けたセット。Scoreで自動的にソート。
Scoreは重複可能だが、setの各要素はセット型と同じく重複出来ない。
Scoreを評価して値を取り出す事ができる。Scoreのランキングも取得可能。

・使いどころ

ランキングのような機能を作るために生まれてきたんじゃないかくらい、ランキング作りやすい。
アクセスカウンタ、最新更新順表示など、特定の順序で参照される様なデータ。
※リスト型との使い分けとして、リスト型に対するSORTコマンドを高い頻度で使わなければならない場合は負荷が高くなるのでSorted setを使う。時系列ソートでなければこっち。


■Hash - ハッシュ型

・概要

1つのkeyに対して、field-value型のMapを格納する。
key名はもちろん、key内でのfield名も重複付加。key名が違う場合はfield重複出来る。


・使いどころ

会員情報など、ユーザー名・パスワード・最終ログイン時刻などの構造化されたフィールドを保持させたりできる。




それぞれにクセがあるのでMySQL脳から頭切り替えないとアカン。


※参考
公式日本語リファレンス - データ型
http://redis.shibu.jp/datatypes.html

ニコニコ生放送に見るRedis活用ノウハウ
http://gihyo.jp/dev/feature/01/redis


2013-03-14

expect.jsでNode.jsのテストで色々試した

Node.jsでBDD / TDDするときに必要なモジュール


テストを書くときにも便利なモジュールが沢山あります。
メインで使うのはJasmineとかも良く使われてるみたいだけど、visionmedia製のmochaが扱いやすい。

mocha上では色んなアサーション系モジュールが使える。
(調べたらAssertionは断言、断定するって意味だた。なるほど。)
基本はNode.js自体で持っているAssertで良いハズなんだけども、should.jsとかexpect.jsとかchaiとか色んなものがある。

それぞれはこんなふうに書ける。(requireとかは省略)

それぞれに特徴があって、どれ使ってもなんとかなる感じ。
should => きっと〜だろう。
expect => 〜だと予想する。
みたいに、こうあって欲しいなという英語が使われていて、英語がわかれば使いやすい作りになってる。(''.should.be.empty => ""は空でなければならない。みたいな)

今使っているのはshould.jsをベースにしたexpect.js。
クロスブラウザ対応してたりどんな環境でも特に問題なく動くそうだ。


expect.jsの使い方。


色んな使い方があるけど殆どはドキュメント見ればそのとおりに動く。

基本的な所だと

aはanにも出来るくらい自然言語に近く扱えるらしい。英語出来ないと恩恵ないけどw


ちょっと詰まったのでメモ。
複数のErrorをthrowしちゃうメソッドをチェックするときはちょっと工夫が必要だった。

引数によってthrow結果が変わる場合、そのまま
expect(targetMethod(null)).to.throwError(/param is empty/);
とか書きたくなるけど、これだとtargetMethodが実行されて普通にErrorがthrowされてテストが止まってしまう。

それを回避するためにクロージャを使ってErrorの出し分けをやってみたら上手く行ったわけです。

ただテストに慣れてないだけっていう噂もあるけど、JavaScriptでテストを書くときはexpect.js使って大体のことが出来そうです。

間違ってたり、もっと良い使い方、書き方があれば勉強中なので教えてください〜〜。
よろしくお願い致します。