テクノロジー

Redis超入門 2.データ型と操作まとめ

Redis超入門 2.データ型と操作まとめ

こんにちは。ぐっさんです。
前回に引き続き、今回はRedisのデータ型とそれらに対応する操作をまとめます。

対象読者/前提知識

RDBMSの知識を有している
RedisやKVSについて興味がある
最低限のDockerの知識

Redisのデータ型と基本操作

Redisで定義されている主なデータ型は以下の5つです。

String型
List型
Set型
Hash型
SortedSet型(ソート済みSet型)

※すべてのデータ型は公式HPを確認くださいRedis公式

String型

最も一般的なKVSのデータ型です。
String型は最大512MBまでのあらゆる種類の値を格納することができます。
(バイナリデータもOKなので、画像ファイルなども格納できる。)

基本の操作
登録:SET
取得:GET
削除:DEL
です

List型

List型は同じKeyに対して、重複を許した複数のString型を格納することができる型です。
最大で2^32-1(4294967295)の要素を追加することができます。
登録された順番を保持しているので、Arrayのように使用することが可能です。
RedisのList型はLinedListで作られているため、先頭や最後に要素を追加/削除する場合、どんなに大きなListを持っていてもO(1)の速度で処理されます。
逆に、途中に挿入/削除する場合はO(n+1)の速度になるので意識して設計する必要があります。

基本の操作は
登録:LPUSH/RPUSH
取得後削除:LPOP/RPOP
取得:LRANGE
です

Set型

Set型は同じKeyに対して、重複を許さない複数のString型を格納することができる型です。
List型と同様に最大で2^32-1(4294967295)の要素を追加することができます。
List型と違い登録された順番は保持していません。
また、取得もランダムに取得することしかできません。
しかし、Set型同士で和・差・積の演算が可能です。
何らかの集合に対する演算が高速にできる型という認識ですが、実務で使う場面に遭遇したことがありません。。。
統計処理などで使えるのかも?

要素単位の基本の操作は
登録:SADD
ランダム取得後削除:SPOP
ランダム取得:SRANDMEMBER
です。

Set単位の操作は
Setの差:SDIFF
Setの和:SUNION
Setの積:SINTER
です。

Hash型

Hash型はフィールドとバリューのMapを格納することができる型です。
Hash型も2^32-1(4294967295)の要素を追加することができます。
言葉で説明するより操作を見たほうがわかりやすいので例を見てみましょう。

以下の例では親キー「hash_key」に3つのフィールド「field_1」「field_2」「field_3」を設定し、すべて取得やフィールドごとに取得しています。

String型にJSONなどを格納した場合、アプリケーションはJSON取得→内部オブジェクトに変換→なんらかの操作→JSONに変換→Setで登録という流れをする必要があります。
しかし、一部のフィールドのみを更新したい場合などは上記の流れだとJSONと内部オブジェクトの相互変換が必要になり冗長です。
こんなときにHash型は力を発揮するでしょう。

基本的な操作は
フィールド単位で登録:HSET
フィールド単位で取得:HGET
複数フィールド同時に登録:HMSET
複数フィールド同時に取得:HMGET
です。

SortedSet型(ソート済みSet型)

スコア順に並び替えがされたSet型です。

以下の例ではキー「sort_hash_test」にメンバー3つ「Bob」「Ken」「Nick」をそれぞれスコアをつけて登録し、
スコアの低い順にすべて取得しています。

オンラインゲームのリーダーボードを想像すると使い方がわかりやすいと思います。
RDBでも同様のことは実現できますが、例えば100位〜200位を取得するような処理の場合、全レコードに対してのソート処理をしてから取得する必要があり、重めの処理になります。
ソート済みSet型の場合はデータ登録時点でソートされているため、取得したい範囲を指定するだけで処理が簡潔に書けます。

基本的な操作は
登録:ZADD
スコアの加算:ZINCRBY
自身の順位取得:ZRANK/ZREVRANK
削除:ZREM
順位順に取得:ZRANGE(スコアの昇順)/ZREVRANGE(スコアの降順)
です。

まとめ

いかがでしたでしょうか。
データ型によって操作自体が異なるため、RDBとは考え方を変える必要がおわかりになったでしょうか。
次回はRedisを使ったシステムを作るときの、データの設計について書きたいと思います。
ぜひ次回もご覧ください。