インメモリ・データベースRedisはString、Hash、List、Setなどのデータ構造をサポートしている。本節では、Set型の活用方法について説明する。
Set型は、一つのキーに複数の要素データの集合を保存するときに利用する。Set型の特徴は、集合に保存される要素データは重複せず、ソートもされない。
Set型データを操作する基本コマンド
以下に、Redis-cliでSet型データを操作するための基本コマンドを示す。
# 要素の追加
127.0.0.1:6379> sadd users Mike Marry Jack
(integer) 3
# 要素の表示
127.0.0.1:6379> smembers users
1) "Marry"
2) "Jack"
3) "Mike"
# 要素の数の表示
127.0.0.1:6379> scard users
(integer) 3
# 要素の削除
127.0.0.1:6379> srem users Mike
(integer) 1
Set型の集合演算
Set型に対して、和、差、積の集合演算ができる。以下、業務例を用いて説明する。
あるWebサイトでは、毎日新規登録したユーザID、および翌日に再度ログインしたユーザIDを集計する要件があるとする。RedisのSet型を用いて、以下の手順でこの要件を実現できる。
- 既存ユーザIDを保存するSetを用意する。そのSetのキーに「
user:id
」を指定する。 - 日付ごとにログインしたユーザIDを保存するSetを用意する。そのSetのキーに「
user:id:yyyyMMdd
」を指定する。「yyyyMMdd」は日付である。
例えば、2020/09/07にログインした3つのユーザID(100460 100451 100341)を以下のコマンドでRedisに保存する。
# 2020/09/07にログインしたユーザIDをuser:id:20200907に保存する
sadd user:id:20200907 100460 100451 100341
和集合コマンドで、毎日のログインユーザIDを既存ユーザIDのSetに追加する。
# user:id:20200907とuser:idの和集合をuser:idに保存する
sunionstore user:id user:id user:id:20200907
2020/09/08に新規ログインユーザIDのSetを求めるには、以下の差集合コマンドを利用する。
# user:id:20200908とuser:idの差集合、つまり、新規ユーザIDをuser:newに保存する
sdiffstore user:new user:id:20200908 user:id
2020/09/08に新規登録して、かつ、2020/09/09にもログインしたユーザIDのSetを求めるには、以下の積集合コマンドを利用する。
# user:newとuser:id:20200909の両方にあるユーザIDをuser:remに保存する
sinterstore user:rem user:new user:id:20200909
上記例のように、集合演算が必要な業務要件は、RedisのSet型を利用して簡単に実現できる。もちろん、MySqlなどのRDBを利用しても同じことを実現できるが、高性能のRedisを活用することも一つの選択肢になるではないか。