RedisにはStrings, Lists, Sets, Hashes, Sorted Setsなどのデータ型があります。このページではList, Sets, Hashes, Sorted Setsの使い方を説明します。
前提
公式ドキュメント
参考になる公式ドキュメントを以下に示します。
動作確認済環境
以下の環境で動作確認をします。
ZRANGEコマンドの使用がversion 6.2.0以降で大きく変わるため、このページでは最新版のRedis Serverで動作確認をしています。
- Rocky Linux 8.6
- Redis 7.0.2
コマンド一覧
Listを操作するコマンドを以下にまとめます。
コマンド | 意味 |
---|---|
LPUSH key element [element …] | Listの左(Left:先頭)に要素を追加します |
RPUSH key element [element …] | Listの右(Right:末尾)に要素を追加します |
LLEN key | Listの要素数を返します |
LRANGE key start stop | Listから要素を取得します |
LPOP key [count] | Listの左(Left:先頭)からcount個の要素を取り出します |
RPOP key [count] | Listの右(Right:末尾)からcount個の要素を取り出します |
Setを操作するコマンドを以下にまとめます。いずれも先頭が「S」で始まります。
コマンド | 意味 |
---|---|
SADD key member [member …] | Setに要素を追加します |
SREM key member [member …] | Setから要素を削除します |
SMEMBERS key | Setに格納された要素を返します |
SRANDMEMBER key [count] | Setのうち要素をランダムで返します。countを指定した場合は、指定個数の要素を返します。 |
SISMEMBER key member | memberがkey(Set)に含まれるかを返します |
SINTER key [key …] | Setの積集合(共通部分)を返します |
SUNION key [key …] | Setの和集合を返します |
SDIFF key [key …] | Setの差集合を返します (SQLのMINUS演算子相当) |
Hashesを操作するコマンドを以下にまとめます。いずれも先頭が「H」で始まります。
コマンド | 意味 |
---|---|
HSET key field value [field value …] | Hashesにfield-valueのペアを追加します |
HMSET key field value [field value …] | Hashesにfield-valueのペアを追加します(deprecated) |
HDEL key field [field …] | Hashesのfieldを削除します |
HGET key field | Hashesのfieldに対するvalueを取得します |
HMGET key field [field …] | Hashesのfieldに対するvalueを取得します |
HGETALL key | Hashesのすべてのfield-valueを取得します |
HKEYS key | Hashesのすべてのfieldを取得します |
HVALS key | Hashesのすべてのvalueを取得します |
HINCRBY key field increment | Hashesのすべてのkeyに対するfieldを加算します |
HINCRBYFLOAT key field increment | Hashesのすべてのkeyに対するfieldを加算します |
Sorted Setを操作するコマンドを以下にまとめます。いずれも先頭が「Z」で始まります。
「[redis-db] What’s ‘z’ stands for in command names related to sorted sets」によると、先頭が「Z」で始まる経緯は「Z-Buffer」のコンセプトに基づいているからだそうです。
ZRANGEコマンドの使用がversion 6.2.0以降で大きく変わります。
コマンド | 意味 |
---|---|
ZADD key [NX | XX] [GT | LT] [CH] [INCR] score member [score member …] | Sorted Setに要素を追加します |
ZRANGE key start stop [BYSCORE | BYLEX] [REV] [LIMIT offset count] [WITHSCORES] | Sorted Setからデータを取得します。BYSORE, BYLEX, REV, LIMITオプションはversion 6.2.0以降のみ指定可能です。 |
ZRANGEBYLEX key min max [LIMIT offset count] | Sorted Setから指定位置のデータを取得します(version 6.2.0未満) |
ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count] | Sorted Setから指定スコアのデータを取得します(version 6.2.0未満) |
ZREVRANGE key start stop [WITHSCORES] | Sorted Setからデータを取得し、逆順で表示します(version 6.2.0未満) |
ZREVRANGEBYLEX key max min [LIMIT offset count] | Sorted Setから指定位置のデータを取得し、逆順で表示します(version 6.2.0未満) |
ZREVRANGEBYSCORE key max min [WITHSCORES] [LIMIT offset count] | Sorted Setから指定スコアのデータを取得し、逆順で表示します(version 6.2.0未満) |
List
データ型の説明
RedisのListは順序付きリストを格納するデータ型です。
JSONで直感っぽい記述をすれば以下のようになります。
{ "books": [ "Peopleware", "Clean Code", "Code Complete" ] }
追加(PUSH)
LPUSHやRPUSHコマンドを使用すると、Listに対して要素の追加が可能です。LPUSHは左(Left:先頭)に要素を追加し、RPUSHは右(Right:末尾)に要素を追加します。
操作例を以下に示します。
127.0.0.1:6379> LPUSH books "Clean Code" (integer) 1 127.0.0.1:6379> RPUSH books "Code Complete" (integer) 2 127.0.0.1:6379> LPUSH books "Peopleware" (integer) 3
以上のような操作をすると、左(先頭)から順にPeopleware, Clean Code, Code Completeの順に格納されたリストが作成されているはずです。
情報取得
LRANGEコマンドを使用すると、Listに格納された要素を取得できます。取得する要素の位置は、0番から採番した位置を指定します。
LRANGE <先頭位置> <末尾位置>
例えば、先頭(0番目)の要素を取得するには以下のように操作します。
127.0.0.1:6379> LRANGE books 0 0 1) "Peopleware" 127.0.0.1:6379>
位置に-1を指定した場合はListの末尾の意味になります。ですので、「LRANGE <リスト名> 0 -1」と指定した場合は、リストの全件取得を意味します。
127.0.0.1:6379> LRANGE books 0 -1 1) "Peopleware" 2) "Clean Code" 3) "Code Complete" 127.0.0.1:6379>
件数取得
LLENコマンドを使用すると、Listの長さ(要素数)を取得できます。
127.0.0.1:6379> LLEN books (integer) 3 127.0.0.1:6379>
取り出し(POP)
LPOPやRPOPコマンドを使用すると、Listからの取り出し(POP)が可能です。LPOPは左(Left:先頭)の要素を取り出しし、RPOPは右(Right:末尾)の要素と取り出します。
127.0.0.1:6379> LRANGE books 0 -1 1) "Peopleware" 2) "Clean Code" 3) "Code Complete" 127.0.0.1:6379> LPOP books "Peopleware" 127.0.0.1:6379> RPOP books "Code Complete" 127.0.0.1:6379>
Sets
データ型の説明
RedisのSetsは重複を許さない集合を格納するデータ型です。
JSONで直感っぽい記述をすれば以下のようになります。
{ "myset": [ "Hello", "World" ] }
追加
SADDコマンドを使用すると、Setに対して要素の追加が可能です。
操作例を以下に示します。
Setは重複を許さない集合です。”World”を追加する操作を2回しますが、1つの”World”しか格納されません。
127.0.0.1:6379> SADD myset "Hello" (integer) 1 127.0.0.1:6379> SADD myset "World" (integer) 1 127.0.0.1:6379> SADD myset "World" (integer) 0 127.0.0.1:6379>
取得
SMEMBERSコマンドを使用すると、Setに格納された要素を抽出できます。
127.0.0.1:6379> SMEMBERS myset 1) "World" 2) "Hello" 127.0.0.1:6379>
積集合(INTERSECT)
SINTERコマンドを使用すると、2つのSetの積集合(共通部分)を求める事ができます。
127.0.0.1:6379> SADD key1 a b c (integer) 3 127.0.0.1:6379> SADD key2 c d e (integer) 3 127.0.0.1:6379> SINTER key1 key2 1) "c" 127.0.0.1:6379>
和集合(UNION)
SUNIONコマンドを使用すると、2つのSetの和集合を求める事ができます。
127.0.0.1:6379> SADD key1 a b c (integer) 3 127.0.0.1:6379> SADD key2 c d e (integer) 3 127.0.0.1:6379> SUNION key1 key2 1) "d" 2) "b" 3) "c" 4) "a" 5) "e" 127.0.0.1:6379>
和集合(DIFF)
SDIFFコマンドを使用すると、2つのSetの差集合を求める事ができます。
SQLのMINUS相当の操作です。SDIFF key1 key2を実行した場合は、key1のみに存在する要素を返します。
127.0.0.1:6379> SADD key1 a b c (integer) 3 127.0.0.1:6379> SADD key2 c d e (integer) 3 127.0.0.1:6379> SDIFF key1 key2 1) "a" 2) "b" 127.0.0.1:6379>
Hashes
データ型の説明
RedisのHashesはkey-value(field-value)のペアを格納するデータ型です。
JSONで直感っぽい記述をすれば以下のようになります。
{ "movie": { "title": "The Godfather", "year": 1972, "rating": 9.2, "watchers": 10000000 } }
追加
HSETコマンドを使用すると、Hashesに対してkey-valueの追加が可能です。
操作例を以下に示します。
127.0.0.1:6379> HSET movie "title" "The Godfather" (integer) 1 127.0.0.1:6379>
HSETコマンドは複数のkey-valueを同時に追加する事もできます。
HMSETコマンドでも複数のkey-valueを同時に追加できますが、HMSETコマンドはdeprecated(廃止予定)である事に注意ください。
127.0.0.1:6379> HSET movie "year" 1972 "rating" 9.2 "watchers" 10000000 OK 127.0.0.1:6379>
取得
HGETALLコマンドを使用すると、Hashesのkey-value一覧の取得ができます。
127.0.0.1:6379> HGETALL movie 1) "title" 2) "The Godfather" 3) "year" 4) "1972" 5) "rating" 6) "9.2" 7) "watchers" 8) "10000000" 127.0.0.1:6379>
HKEYSコマンドを使用すると、Hashesのkey一覧の取得ができます。
127.0.0.1:6379> HKEYS movie 1) "title" 2) "year" 3) "rating" 4) "watchers" 127.0.0.1:6379>
HVALSコマンドを使用すると、Hashesのvalue一覧の取得ができます。
127.0.0.1:6379> HVALS movie 1) "The Godfather" 2) "1972" 3) "9.2" 4) "10000000" 127.0.0.1:6379>
HGETコマンドやHMGETを使用すると、Hashesのkeyに対するvalueを取得できます。
127.0.0.1:6379> HGET movie "title" "The Godfather" 127.0.0.1:6379> HMGET movie "title" "year" 1) "The Godfather" 2) "1972" 127.0.0.1:6379>
算術操作
HINCRBYコマンドやHINCRBYFLOATコマンドを使用すると、Hashesのkeyに対するvalueの加減ができます。
127.0.0.1:6379> HMGET movie "rating" "watchers" 1) "9.2" 2) "10000000" 127.0.0.1:6379> HINCRBYFLOAT movie "rating" -0.1 "9.1" 127.0.0.1:6379> HINCRBY movie "watchers" 3 (integer) 10000003 127.0.0.1:6379> HMGET movie "rating" "watchers" 1) "9.1" 2) "10000003" 127.0.0.1:6379>
削除
HDELコマンドを使用すると、Hashesに対して1つのkey-valueの削除が可能です。
127.0.0.1:6379> HKEYS movie 1) "title" 2) "year" 3) "rating" 4) "watchers" 127.0.0.1:6379> HDEL movie watchers (integer) 1 127.0.0.1:6379> HKEYS movie 1) "title" 2) "year" 3) "rating" 127.0.0.1:6379>
Sorted Sets
データ型の説明
RedisのSorted Setsはスコア順に並べた重複を許さない集合を格納するデータ型です。
JSONで直感っぽい記述をすれば以下のようになります。
{ "myzset": [ { "1": "one" }, { "1": "uno" }, { "2": "two" }, { "3": "three" } ] }
追加
ZSETコマンドを使用すると、Sorted Setsに対して要素の追加が可能です。
操作例を以下に示します。
127.0.0.1:6379> ZADD myzset 1 "one" (integer) 0 127.0.0.1:6379> ZADD myzset 1 "uno" (integer) 0 127.0.0.1:6379>
ZSETコマンドは複数の要素を同時に追加する事もできます。
127.0.0.1:6379> ZADD myzset 2 "two" 3 "three" (integer) 0 127.0.0.1:6379>
全件取得
ZRANGEコマンドを使用すると、Sorted Setsに格納された要素を取得できます。取得する要素の位置は、0番から採番した位置を指定します。-1を指定した場合は末尾の位置を表します。
ZRANGE <先頭位置> <末尾位置>
操作例は以下の通りです。
127.0.0.1:6379> ZRANGE myzset 0 -1 1) "one" 2) "uno" 3) "two" 4) "three" 127.0.0.1:6379>
ZRANGEコマンドにWITHSCORESオプションを付与すると、各要素のスコアも同時に表示されます。
127.0.0.1:6379> ZRANGE myzset 0 -1 WITHSCORES 1) "one" 2) "1" 3) "uno" 4) "1" 5) "two" 6) "2" 7) "three" 8) "3" 127.0.0.1:6379>
ZRANGEコマンドのオプション
前述したZRANGEコマンドは、正確には以下のような書式です。オプションによって逆順に表示したり表示件数を制御したりできます。
ZRANGE key start stop [BYSCORE | BYLEX] [REV] [LIMIT offset count] [WITHSCORES]
以下のようなテストデータを投入します。
ZADD leaderboard:455 15 user:4 ZADD leaderboard:455 100 user:1 ZADD leaderboard:455 101 user:3 ZADD leaderboard:455 152 user:5 ZADD leaderboard:455 275 user:2
ZRANGEコマンドは特段の指定をしない場合は、startとstopは位置で指定しますが、BYSCOREオプションを指定するとSCOREに基づく範囲の要素を抽出できます。例えば以下のように指定すれば、100以上199以下のユーザを抽出できます。
127.0.0.1:6379> ZRANGE leaderboard:455 100 199 BYSCORE 1) "user:1" 2) "user:3" 3) "user:5" 127.0.0.1:6379>
ZRANGEコマンドにREVオプションを付与すると、スコアの逆順に表示されます。
127.0.0.1:6379> ZRANGE leaderboard:455 199 100 BYSCORE REV 1) "user:5" 2) "user:3" 3) "user:1" 127.0.0.1:6379>
ZRANGEコマンドにLIMITオプションでoffset countを付与すると、特定の要素を取得できます。例えば、LIMIT 1 2のようにoffset=1 count=2と指定すれば、1番目(0から採番)から2つの要素を取り出す意味になります。
127.0.0.1:6379> ZRANGE leaderboard:455 -inf +inf BYSCORE LIMIT 1 2 1) "user:1" 2) "user:3" 127.0.0.1:6379>
補足
version 6.2.0未満のZRANGEコマンド相当の操作
Redis version 6.2.0以降ではZRANGEコマンドに様々なオプションを指定して逆順に表示したり表示件数を制御したりできます。しかし、このオプションはRedis version 6.2.0以降からの仕様変更で、version 6.2.0未満ではZRANGEBYSCOREコマンドやZREVRANGEコマンドなどを使用します。
それでは動作確認用のデータを投入しましょう。
ZADD leaderboard:455 15 user:4 ZADD leaderboard:455 100 user:1 ZADD leaderboard:455 101 user:3 ZADD leaderboard:455 152 user:5 ZADD leaderboard:455 275 user:2
ZRANGEBYSCOREコマンドを使用するとSCOREに基づく範囲の要素を抽出できます。例えば以下のように指定すれば、100以上199以下のユーザを抽出できます。
127.0.0.1:6379> ZRANGEBYSCORE leaderboard:455 100 199 1) "user:1" 2) "user:3" 3) "user:5" 127.0.0.1:6379>
ZREVRANGEコマンドやZREVRANGEBYLENコマンドやZREVRANGEBYSCOREコマンドを付与すると、逆順に表示されます。
127.0.0.1:6379> ZREVRANGEBYSCORE leaderboard:455 199 100 1) "user:5" 2) "user:3" 3) "user:1" 127.0.0.1:6379>