5
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Redisのデータ構造Set型の活用

Last updated at Posted at 2020-09-08

インメモリ・データベース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を活用することも一つの選択肢になるではないか。

5
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?