Redis データ型(List, Sets, Hashes, Sorted Sets)

スポンサーリンク

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> 
タイトルとURLをコピーしました