Redisの基本データ型とコマンド
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型に対応するコマンド
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]
これら以外にもコマンドはありますが、多すぎるので一旦ここまでにしておきます。
とりあえず各セクションで貼った図を覚えればなんとなくデータ型のイメージはつくと思います。
Discussion