オルトプラスエンジニアの日常をお伝えします!

Redisでオブジェクトを検索方法について

※この記事は「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

複数の基準に一致するオブジェクトを検索

条件が多い場合は、SINTERSUNIONと言う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は将来的に、大きな規模のプライマリ・データベースとして使用するための効率的なツールになる可能性があると思います。
是非皆さんも一度やってみてください!