RedisのZSETを使った集計方法
PRTIMESエンジニアの吉です。 弊社ではNode.JSとRedisを使って一部の機能を実装しています。 今日はRedisをつかった集計方法ノウハウをみなさんと共有したく、簡単に紹介したいと思います。
なぜ集計にRedisを使うのか
最近のWebアプリケーションは様々なシーンにおいて大量のデータをサーバーに送ってきます。 特にユーザーのアクセス情報や行動ログ、内部セッションデータの保存などデータ間の関係性が低い情報に関してはNoSQLに保存するのが望ましいと思います。
ここで登場するのがRedisです。 Redisはデータをメモリ上に保持するので非常に高速な処理が可能です。 また、list, set, zset, hashといったデータ構造を持っていて効果的にデータを保存できる点からデータの集計に向いていると考えているからです。
以下、Redisのzsetを使って期間別のデータを絞り込んでScoreを合算する方法の一部をまとめました。
データ保存時のzset構成
Index用データzset
ここで登録するデータは期間別に登録された情報を絞り込むためのIndexの役割をします。 タインプスタンプがscore、実データkey名がvalueとなります。 以下、redisの登録コマンドです。
ZADD data:index 1458010816 data:1
集計対象データzset
ここで登録するデータは実データ、集計対象となるデータです。 集計したい値がscore、項目名がvalueとなります。以下、redisの登録コマンドです。
ZADD data:1 10 value_1 20 value_2 30 value_3 ...
集計
集計対象データのkey名を取得
まずはindex用zsetデータから期間を絞り込んで集計対象となるデータのkey nameを抽出します。 以下、redisの抽出コマンドです。
ZRANGEBYSCORE data:index 1458010816 1458010816
結果作成
取得したkey名をもとに集計を実施します。zunionstoreを実行すると新たなdata:sumというzsetが生成されます。 data:sumにはzunionstoreで指定したzsetの合算値が入ります。 以下、redis集計コマンドです。
ZUNIONSTORE data:sum 4 data:2 data:3 data:5 data:6
感想
今回のブログではredisのzsetを使った集計の一例を紹介しました。 みなさんご存知のとおり、簡単にデータの保存ができて高速に処理が行われることにすごく感銘を受けています。 集計以外でもRedisは様々な使い道がありますので積極的にredisを使いブログを通じて紹介したいと思います。