前回の記事の続きで、
本記事では、Set型とSorted Set型を取り上げようと思います。
これらのデータ型もString型、List型、Hash型と同じく、
重要なのと、Sorted Set型については、
やや特徴が強いデータ型なので、こちらについても、
解説していきます。
Set型
Set型は、RedisのString型の集合という点では、
List型と似ているのですが、
異なる点として、重複をゆるさない
という点と、順序を持たないという点です。
例えば、List型だと重複を可能にし、順序を保持する。
redis-cli> LPUSH same_list same same same
(integer) 3
redis-cli> LRANGE same_list 0 -1
1) "same"
2) "same"
3) "same"
redis-cli> LPUSH same_list first
(integer) 4
redis-cli> LRNAGE same_list 0 0
1) "first"
これに対して、Set型の場合、
重複が起きない。また順序も保持していないので、
List型のように、何番目の値を取得するということもできない。
redis-cli> SADD same_set same same same
(integer) 1
redis-cli> SMEMBERS same_set
1) "same"
redis-cli> SADD set_list 1 2 3 4 123 test
(integer) 6
redis-cli> SMEMBERS set_list
1) "1"
2) "4"
3) "3"
4) "123"
5) "2"
6) "test"
Set型のコマンド
コマンド一覧は、下記のドキュメントにあります。
https://redis.io/commands/?group=set
SADD
こちらは既に使いましたが、
指定した集合に対して、任意の数の値を追加します。
SADD set_list 1 2 1 test
SCARD
集合に保存されている値の数を返します。
SCARD set_list
SISMEMBER
指定した集合について、値が集合に含まれているかを返します。
含まれている場合は1を、含まれていない場合は0を返します。
redis-cli> SISMEMBER set_list test12
(integer) 0
redis-cli> SISMEMBER set_list test
(integer) 1
SMEMBERS
これも先程やりましたが、
指定した集合について、すべての値を返します。
SMEMBERS set_list
SPOP
指定した集合について、ランダムに値を返して、
その値を集合から削除します。
redis-cli> SPOP set_list
"2"
redis-cli> SPOP set_list
"test"
redis-cli> SPOP set_list
"1"
redis-cli> SPOP set_list
(nil)
redis-cli> SMEMBERS set_list
(empty array)
SREM
こちらも削除系で、
指定した任意の値を削除します。
SREM set_list 123 test
SDIFF
複数の集合について、最初の集合から、それに続く集合の
差から生じる集合を返します。
redis-cli> SMEMBERS set_list
1) "1"
2) "4"
3) "3"
4) "2"
redis-cli> SMEMBERS set_list2
1) "1"
2) "3"
3) "5"
4) "32"
redis-cli> SDIFF set_list set_list2
1) "2"
2) "4"
redis-cli> SDIFF set_list2 set_list
1) "5"
2) "32"
SINTER
指定された複数の集合の共通となる値の集合を返します。
SINTER set_list set_list2
SUNION
指定した集合に含まれるすべての値の集合を重複を除いて返します。
SUNION set_list set_list2

Sorted Set型
Sorted Setは順序のあるSetのような感じで、
重複が許されない集合です。
特徴的なのは、スコアをもたせることができる点です。
ゲームなどのスコアの集計に便利なデータ型ですね。
イメージとしては、
sorted_set_list → 0.value2:500, 1.value3:200, 2.value:100
のような感じです。
Hashとやや似ている気もしますが、
異なるのは、Hashは順序を持たないので、
ランキング集計とかにはSorted Setのほうが向いているということです。
HashとSetのいいとこ取りをしたようなデータ型ですね。
使用例としては下記のような感じです。
redis-cli> ZADD sorted_set_list 100 value1
(integer) 1
redis-cli> ZADD sorted_set_list 500 value2
(integer) 1
redis-cli> ZADD sorted_set_list 200 value3
(integer) 1
redis-cli> ZREVRANGE sorted_set_list 0 -1
1) "value2"
2) "value3"
3) "value1"
redis-cli> ZREVRANGE sorted_set_list 0 -1 WITHSCORES
1) "value2"
2) "500"
3) "value3"
4) "200"
5) "value1"
6) "100"
以下、コマンドについて解説します。
Sorted Set型のコマンド
ドキュメントはこちら。
今までよりもコマンド多めですね。
https://redis.io/commands/?group=sorted-set
ZADD
こちらすでに登場しているが、
スコアと値を集合に追加します。
ZADD test_list 20 value
ZCARD
キーで指定した集合について、
値の数を返します。
ZCARD test_list
ZRANK
集合について、指定した値のスコアの低い順での順位を返します。
順位は0から始まるので、最も低い場合は、0となる
ZRANK test_list value3
ZREVRANK
こちらは、ZRANKの高い順version。
ZREVRANK test_list value3
ZREM
集合について、指定した値を削除します。
ZREM test_list value2
ZMSCORE
集合について、指定した一つ以上の値のスコアを返します。
ZMSCORE test_list value1 value3
ZRANGE
集合について、指定された範囲の要素を返します。
デフォルトだと、低い順です。
ZRANGE test_list 0 -1
REVオプションでスコアが高い順になります。
ZRANGE test_list 0 -1 WITHSCORES REV
スコアの数値で絞り込みすることも可能で、
例えば、スコアが0 < score 10の場合は、
ZADD test_list 10 value10
ZADD test_list 0 value0
ZADD test_list 4 value4
ZADD test_list 9 value9
ZRANGE test_list (0 (10 BYSCORE WITHSCORES
スコアが 0 <= score < 10なら
ZRANGE test_list 0 (10 BYSCORE WITHSCORES