🟥

Redisの基本データ型とコマンド

2024/03/12に公開

Redisとは

Redis(Remote Dictionary Server)は、オープンソースのKVSです。ミリ秒未満の応答時間を実現する、非常に高速なインメモリデータベースとして知られ、主にキャッシングやセッション管理、リアルタイム分析などの用途で使用されます。単一スレッドモデルを採用しており、それによってシンプルで高性能な動作を実現しています。
Redisには複数のデータ型が存在し、データ型ごとに独立したコマンドが存在します。その為、一部の例外を除いてデータ型によってコマンドを使い分ける必要があります。

データ型

Redis上で扱う主なデータ型は以下の5つです。

  • String型(文字列型)
  • List型
  • Hash型
  • Set型
  • Sorted Set型

これ以外にもBitMap,地理空間インデックスといった補助的な型も存在しますが
本記事では省略します。

String型(文字列型)

Redisで扱う型の中で最も基本的で最も広く使われているものです。Redis文字列型はバイナリセーフです。つまりRedis文字列型はどんな種類のデータも保持できるということです。たとえばJPEGイメージやシリアライズされたオブジェクトなども持つことができます。また、プログラミング言語におけるバイナリデータ、整数、浮動小数点のいずれもString型として扱います。

  • 特徴
    • キーに値を1対1で関連付ける、最もシンプルな型
    • バイナリセーフな文字列
  • ユースケース
    • キャッシュ
      • シンプルなキー・値のペアで対応する文字列
      • セッション情報
      • 画像データなどのバイナリデータ
    • カウンター
      • 訪問者数などのアクセス数カウント
    • メトリクス
      • リアルタイムに値が変化するメトリクスなど

String型に対応するコマンド


SET

文字列値 value をキー key にセットします。

  SET key value [ NX | XX] [GET] [ EX seconds | PX milliseconds | EXAT unix-time-seconds | PXAT unix-time-milliseconds | KEEPTTLs ]
オプション 説明
EX (seconds) 指定された有効期限を秒単位で設定します。
PX (milliseconds) 指定された有効期限をミリ秒単位で設定します。
EXAT (timestamp-seconds) キーの有効期限が切れる指定されたUnix時間を秒単位で設定します。
PXAT (timestamp-milliseconds) キーの有効期限が切れる指定されたUnix時間をミリ秒単位で設定します。
NX キーがまだ存在しない場合にのみキーを設定します。
XX キーが既に存在する場合にのみ、キーを設定します。
KEEPTTL キーに関連付けられた生存期間を保持します。
GET キーに格納されている古い文字列を返すか、キーが存在しない場合は nil を返します。キーに格納されている値が文字列ではない場合、エラーが返され、SETが中止されます。

GET

キーの値を取得します。
もしキーが存在しない場合は、nilが返されます

GET key
redis> SET mykey "Hello"
"OK"
redis> GET mykey
"Hello"

MSET

複数のキー・値のペアを指定し、一括でキーに値をセットします。キーが存在する場合は上書きされます

MSET key value [key valu...]

MGET

全ての指定されたキーの値を返します。
文字列の値を持たない、あるいは存在しない全てのキーについて、nilが返されます。

MGET key [key ...]

APPEND

キーが存在する場合は、キーの値の末尾に引数の内容を追記します。キーが存在しない場合は、引数を値にして新しくString型のキーを作成します。

APPEND key value

STRLEN

キーに格納されている値の文字列の長さを返します。

STRLEN key

GETRANGE

指定したキーの値から範囲を指定してデータを返します。範囲の始点は1文字目が0です。

GETRANGE key start end
redis> SET mykey "This is a string"
"OK"
redis> GETRANGE mykey 0 3
"This"
redis> GETRANGE mykey -3 -1
"ing"
redis> GETRANGE mykey 0 -1
"This is a string"

SETRANGE

キー・値・オフセットの組み合わせを指定し、指定したオフセットの位置を起点として、キーに値をセットします。
返り値として変更後の値の長さが返されます。

SETRANGE key offset value
redis> SET key1 "Hello World"
"OK"
redis> SETRANGE key1 6 "Redis"
(integer) 11
redis> GET key1
"Hello Redis"

String型で値が数値の場合のみ対応するコマンド

INCR

キーに格納されている値を1つだけ増加させます。キーが存在しない場合は操作を行う前に0に設定されます。キーが間違った型の値を含むか、整数として表現できない文字列を含む場合、エラーが返されます。

INCR key
redis> SET mykey "10"
"OK"
redis> INCR mykey
(integer) 11
redis> GET mykey
"11"

INCRBY

キーの値を指定した数だけ増やします。

INCRBY key increment

DECR

キーに格納されている値を1つだ減少させます。

DECR key

DECRBY

キーの値を指定した数だけ減少させます。

DECRBY key decrement

String型で廃止予定or廃止可能性のあるコマンド

以下のコマンドはSETコマンドのオプションで代替可能な為、将来的に廃止される予定、もしくは可能性があります。

GETSET

廃止予定。SETコマンドのGETオプションで代用可能。

SETNX

廃止可能性。SETコマンドのNXオプションで代用可能。
ちなみにSETNX は "SET if Not eXists" の略です。

SETEX

廃止可能性。SETコマンドのEXオプションで代用可能。

PSETEX

廃止可能性。SETコマンドのPXオプションで代用可能。


List型

List型は文字列(String型)のリストです。
リストのキーに対して、複数の値を、順序を維持して保持できます。
値の挿入した順序を保つ、並び順のある型です。そのため、スタックやキューなどに使いやすいです。

  • 特徴
    • 文字列のコレクション。挿入された順序を保つ。
  • ユースケース
    • スタック
    • キュー
    • ログ

リストの図
この図を覚えておくと理解がしやすいです。
リストの左右それぞれについて、端に対する要素の追加・削除の操作や、部分的に要素を取得すると言った操作が可能です。

String型に対応するコマンド

LPOP

キーで指定したリストから最初の要素を削除し、その値を返します。countを指定した場合は指定した数だけ要素を削除して値を返します。
前述の図で例えると左端(Left)から値を取得します。

LPOP key [count]

LPUSH

キーで指定したリストに対して、指定した値を全て先頭に挿入します。
返り値として、操作後のリストの長さを返します。

LPUSH key element [element ...]
redis> LPUSH mylist "world"
(integer) 1
redis> LPUSH mylist "hello"
(integer) 2
redis> LRANGE mylist 0 -1
1) "hello"
2) "world"

RPOP

キーで指定したリストから末尾の要素を削除し、その値を返します。countを指定した場合は指定した数だけ要素を削除して値を返します。
前述の図で例えると右端(Right)から値を取得します。

RPOP key [count]

RPUSH

キーで指定したリストに対して、指定した値を全て末尾に挿入します。
返り値として、操作後のリストの長さを返します。

RPUSH key element [element ...]
redis:6379> RPUSH mylist "hello"
(integer) 1
redis:6379> RPUSH mylist "world"
(integer) 2
redis:6379> LRANGE mylist 0 -1
1) "hello"
2) "world"

LRANGE

キーで指定したリストについて、インデックスの範囲を指定してデータを返します。

LRANGE key start stop

LMPOP

キーで指定したリストから最初、もしくは最後から複数の要素を削除し、その値を返します。
numkeysで対象のリストのキー数を指定します。
countオプションで指定した数までの要素数を削除し、それらの値を返します。

LMPOP numkeys key [key ...] LEFT | RIGHT [COUNT count]
redis> LPUSH mylist "one" "two" "three" "four" "five"
(integer) 5
redis> LMPOP 1 mylist LEFT
1) "mylist"
2) 1) "five"
redis> LRANGE mylist 0 -1
1) "four"
2) "three"
3) "two"
4) "one"

LREM

キーで指定したリストについて、指定した要素を指定した数だけ削除します。
指定した数が正であれば先頭から、負であれば末尾から、0であれば全て削除します。

LREM key count element
redis:6379> RPUSH mylist "hello"
(integer) 1
redis:6379> RPUSH mylist "hello"
(integer) 2
redis:6379> RPUSH mylist "foo"
(integer) 3
redis:6379> RPUSH mylist "hello"
(integer) 4
redis:6379> LREM mylist -2 "hello"
(integer) 2
redis:6379> LRANGE mylist 0 -1
1) "hello"
2) "foo"

Hash型

Hash型は、フィールドとそれに関連付けられた値のマッピングを保持するデータ構造です。
他のプログラミング言語での連想配列や辞書型のような形でデータを保持できます。このような構造は、オブジェクトや構造体を表現するのに非常に便利です。

  • 特徴
    • フィールドと値のマッピングを保持する
    • フィールドには文字列のみ使用可能
    • メモリ効率的にキー/値のペアを格納できる
  • ユースケース
    • ユーザーのプロフィール情報
    • 商品の詳細情報
    • キャッシュ

Hash型の図

Hash型に対応するコマンド

HSET

指定されたフィールドに関連付けられた値を、指定されたHashキーに設定します。

HSET key field value

HGET

指定されたHashキーの指定されたフィールドに関連付けられた値を取得します。

HGET key field
redis> HSET myhash field1 "Hello"
(integer) 1
redis> HGET myhash field1
"Hello"

HMSET

複数のフィールドと値のペアを指定し、指定されたHashキーに一括で設定します

HMSET key field1 value1 [field2 value2 ...]
redis> HMSET myhash field1 "Hello" field2 "World"
"OK"
redis> HGET myhash field1
"Hello"
redis> HGET myhash field2
"World"

HMGET

指定されたHashキーの複数のフィールドに関連付けられた値を一括で取得します。

HMGET key field1 [field2 ...]

HDEL

指定されたHashキーから、指定されたフィールドを削除します。

HDEL key field [field ...]

HEXISTS

指定されたHashキーに、指定されたフィールドが存在するかどうかを確認します。

HEXISTS key field

HKEYS

指定されたHashキーに関連付けられたすべてのフィールドのリストを取得します。

HKEYS key

SET型

SET型は、順序なしで重複を許さない一意の要素のコレクションを保持します。
同じ値を複数回保存しても1つの値として保存されます。

  • 特徴
    • 順序なしの一意な文字列の集合
    • 対象の要素が含まれているかの確認や、集合間での和集合、差集合などの操作で共通要素や差分などの取り出しが可能
  • ユースケース
    • タグの管理
    • グループメンバーシップの追跡

リストの図

SET型に対応するコマンド

SADD

キーで指定した集合について、1つ以上のmemberを追加します。

SADD key member [member ...]
redis> SADD myset "Hello"
(integer) 1
redis> SADD myset "World"
(integer) 1
redis> SADD myset "World"
(integer) 0
redis> SMEMBERS myset
1) "Hello"
2) "World"

SMEMBERS

キーで指定した集合について、全てのmemberを返します。

SMEMBERS key

SISMEMBER

キーで指定した集合について、指定したmemberが集合に含まれるかを表す真偽値を返します。

SISMEMBER key member

SCARD

キーで指定した集合について、保存されているメンバーの数を返します。

SCARD key

SPOP

指定されたSETキーからランダムにメンバーを1つ削除して返します。
countを指定した場合は最大で指定した要素数まで値を返します。

SPOP key [count]

SREM

指定されたSETキーから指定されたメンバーを削除します。

SREM key member [member ...]

Set型で利用可能な集合演算のコマンド

SDIFF

キーで指定した1つ以上の集合について、それらの差集合を返します。

SDIFF key [key ...]
redis> SADD key1 "a"
(integer) 1
redis> SADD key1 "b"
(integer) 1
redis> SADD key1 "c"
(integer) 1
redis> SADD key2 "c"
(integer) 1
redis> SADD key2 "d"
(integer) 1
redis> SADD key2 "e"
(integer) 1
redis> SDIFF key1 key2
1) "a"
2) "b"

SDIFFSTORE

キーで指定した1つ以上の集合について、それらの差集合(それぞれの集合の差)を宛先のキーに保存します

SDIFFSTORE destination key [key ...]

SINTER

キーで指定した1つ以上の集合について、それらの積集合(全ての集合に共通する値)を返します。

SINTER key [key ...]

SUNION

キーで指定した1つ以上の集合について、それらの和集合(全ての値を合わせて重複を省いた値)を返します。

SUNION key [key ...]

Sorted Set型

Sorted Set型は名前の通り、順序のあるSet型の様なものです。
各キーに対してスコアを持ったメンバーからなる1つの集合がマッピングされ、各集合はメンバーの重複が許可されないため一意な値となっています。
ゲーム系企業などがリアルタイムのランキングに活用することも多く、Redisの特徴ともいえるデータ型です。

  • 特徴
    • 順序ありの一意な文字列の集合
    • Set型と類似しているが、全ての要素にはスコアと呼ばれる浮動小数点が関連付け。要素は常にスコアによりソートされており、Set型とは違い特定の範囲の要素を取り出すことが可能。
  • ユースケース
    • ランキング
    • アクティビティフィード

Sorted Set型の各キーは一意で、それそれのキーはスコアと関連づいた順序付き集合です。スコアの高い上位10人のユーザーを算出するといったランキングなどの機能に活用できます。
スコアが関連づけられる点ではHash型と類似していますが、Hash型は順序情報をもちません。
そして重複を許可しない点ではSet型と類似していますが、Set型ではキーに対して値とスコアの両方を紐づけることができません。
Sorted Set型はHash型とSet型が混在した様な順序付き集合の型となって、より広範囲なデータモデルを実現しています。

Sorted Set型に対応するコマンド

ZADD

指定されたSorted Setキーに指定されたスコアとメンバーを追加します。

ZADD key score member [score member ...]
オプション 説明
XX 既に存在している要素のみを更新します。新しい要素を追加しません。
NX 新しい要素だけを追加します。既に存在する要素を更新しません。
LT 新しいスコアが現在のスコア未満の場合、既存の要素だけを更新します。このフラグは新しい要素を追加することを妨げません。
GT 新しいスコアが現在のスコアより大きい場合、既存の要素だけを更新します。このフラグは新しい要素を追加することを妨げません。
CH 戻り値を、追加された新しい要素の数から変更された要素の総数に、変更します (CH は changedの省略形です)。変更された要素は、追加された新しい要素とスコアが更新された既存の要素です。つまり、同じスコアを持つコマンドライン内の指定された要素は過去に持っていたため、カウントされません。注意: 通常はZADDの返り値は新しく追加された要素だけをカウントします。
INCR このオプションが指定された場合、ZADD はZINCRBYのように振舞います。このモードでは、1つのスコア-要素 ペアだけが指定できます。

ZCARD

キーで指定した順序付き集合について、保存されているメンバーの数を返します。

ZCARD key

ZRANK

キーで指定した順序付き集合について、保存されているメンバーを低い順での順位を取り出します。
スコアが最も低いメンバーがランク0となります。

ZRANK key member
redis> ZADD myset 10 "member1"
(integer) 1
redis> ZADD myset 20 "member2"
(integer) 1
redis> ZRANK myset "member1"
(integer) 0
redis> ZRANK myset "member2"
(integer) 1

ZREVRANK

キーで指定した順序付き集合について、保存されているメンバーを高い順での順位を取り出します。
スコアが最も高いメンバーがランク0となります。

ZREVRANK key member
redis> ZADD myzset 10 "one"
(integer) 1
redis> ZADD myzset 20 "two"
(integer) 1
redis> ZADD myzset 30 "three"
(integer) 1
redis> ZREVRANK myzset "three"
(integer) 0

ZREM

指定されたSorted Setキーから指定されたメンバーを削除します。

ZREM key member [member ...]

ZRANGE

指定されたSorted Setキーの範囲内のメンバーをスコア順に取得します。

ZRANGE key start stop [WITHSCORES]

集合演算のコマンド

ZDIFF

キーで指定した順序付き集合について、順序付き差集合を返します。

ZDIFF numkey key [key ...][WITHSCORE]

ZINTER

キーで指定した順序付き集合について、順序付きの積集合を返します。

ZINTER numkey key [key ...][WITHSCORE]

ZUNION

キーで指定した順序付き集合について、順序付きの和集合を返します。

ZUNION numkey key [key ...][WITHSCORE]

これら以外にもコマンドはありますが、多すぎるので一旦ここまでにしておきます。
とりあえず各セクションで貼った図を覚えればなんとなくデータ型のイメージはつくと思います。

参考サイト・書籍

公式ドキュメント
翻訳サイト
翻訳サイトその2
実践Redis入門

ソーシャルデータバンク テックブログ

Discussion