インフラ

【Redis基礎】Set型とSorted Set型

reisuta

Webエンジニア | 20代中盤 | 大学時代はGmailすら知らないIT音痴でプログラミングとは無縁の生活を送る → 独学でプログラミングを学ぶ → Web系受託開発企業にエンジニアとして就職 → Web系自社サービス企業に転職 | 実務未経験の頃からVimを愛好しており、仕事でもプライベートでも開発はVimとTmuxを使っているので、VSCodeに疎いのが最近の悩み。何だかんだでやっぱりRubyが好き。

前回の記事の続きで、
本記事では、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
Macとマグカップの画像

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
  • この記事を書いた人
  • 最新記事

reisuta

Webエンジニア | 20代中盤 | 大学時代はGmailすら知らないIT音痴でプログラミングとは無縁の生活を送る → 独学でプログラミングを学ぶ → Web系受託開発企業にエンジニアとして就職 → Web系自社サービス企業に転職 | 実務未経験の頃からVimを愛好しており、仕事でもプライベートでも開発はVimとTmuxを使っているので、VSCodeに疎いのが最近の悩み。何だかんだでやっぱりRubyが好き。

おすすめ記事はこちら

Vim/Neovimプラグイン 1

プラグインをどれだけ入れるかは、その人の思想なども関係するので、一概にこれがいいというのはないかもしれません。 プラグインを全く入れない人もいれば、100個以上入れる人もいます。 ただそれでも、これだ ...

VimとNeovimの比較 2

本記事では、VimとNeovimの違いについて、解説します。 VimとNeovimの違いについては、普段頻繁にVimなどを使う方でなければ、正直、あまり気にしなくてもいいかなと思います。 ただ、Vim ...

Ruby変数やすべてがオブジェクトについて 3

本記事は、Rubyの基礎文法である、変数や真偽値、論理演算子に触れると同時に、「すべてがオブジェクト」というRubyの特徴的な思想についても解説します。 この思想は、Rubyの文法の根幹になっているの ...

4

エンジニアにおすすめの技術書 書籍学習は、エンジニアの嗜みみたいなところがありますが、 良書というものは、意外とそこまで多くもありません。 そこで本記事では「技術書マニアの筆者が厳選した技術書20選」 ...

5

エンジニアになるには? プログラミングは、専門性が高く自分一人で勉強するのが大変に感じることも多いですよね。 そこで本記事では「おすすめのプログラミングスクール5選」を特徴と、現役エンジニア目線で優れ ...

-インフラ