※この記事は「AltPlus Advent Calendar 2016」の13日目の記事です。
こんにちは、オルトプラスのニャムです。
ベトナムの新卒で日本語がまだ不慣れですので、読みにくかったらすみません!
Redisを学び始めた時、Mysqlに慣れていた私はこれを結構使いづらいと思っていました。
「キーバリューだけでどうやってMysqlのような複雑なクエリを実行できるだろう??」
色々調べてみて、こんなクエリの実行方法を見つけました!
背景:
例えば、 "make"、 "model"、 "color"、 "topSpeed"、 "manufactureDate"などのプロパティを持つCarsオブジェクトがあるとして、Redisに保存します:
redis> HMSET cars:1 make Ferrari model 458 color red topSpeed 202mph
複数の基準に一致するオブジェクトを検索
条件が多い場合は、SINTERとSUNIONと言うRedisコマンドを使って検索できます:
黄色のフェラーリを見つけるには、フェラーリと色:黄色のセットを交差させます:
redis> SINTER make:Ferrari color:Yellow
フェラーリまたはポルシェの全ての黄色のcarsを見つけるには:
redis> SUNION make:Ferrari make:Porsche color:Yellow
範囲クエリ
日付などの範囲に基づいたクエリの場合はどうしますか?
解決方法はRedisソートセットを使います。
例えば、製造日を使用してcarsを見つけることができるようにしたい場合は、製造日のタイムスタンプをスコアとしてソートしたセットにIDを格納する必要があります:
redis> HMSET cars:1 make Ferrari model 458 color red topSpeed 202mph manufactureDate timestamp
redis> ZADD manufacture_date timestamp "1"
redis> HMSET cars:2 make Porsche model Carrera color black topSpeed 179mph manufactureDate timestamp
redis> ZADD manufacture_date timestamp "2"
日付範囲に製造されたCarsを検索するにはZRANGEBYSCOREコマンドを使用します:
redis> ZRANGEBYSCORE manufacture_date timestampStart timestampEnd
混合基準タイプ
もし日付範囲で黄色と言う要素もクエリに入れて、Carsを検索するにはどうしましか?
その場合は、セットとソートセットの両方で動作できるZINTERSTOREコマンドを使用します:
redis> ZINTERSTORE outputKey 2 color:Yellow manufacture_date AGGREGATE MAX
それから、ソートされたセットキーを使って作業しているかのように、必要な範囲を引き出すことができます:
redis> ZRANGEBYSCORE outputKey timestampStart timestampEnd
まとめ
これを参考にして、実際のプロジェクトでMysqlの代わりにRedisを使用できる所があるのでやってみました。
Redisは将来的に、大きな規模のプライマリ・データベースとして使用するための効率的なツールになる可能性があると思います。
是非皆さんも一度やってみてください!