プログラミング言語を整える
中級Redis を整える。
= キャッシュやランキングに使う Redis のコマンドを、本物と同じ表示の再現で試して学ぶ
Redis が初めての方は、先に そもそも Redis とは・どんな場面で使うか をどうぞ。
Redisとは
データをメモリに置いて高速に読み書きするキーバリューストアで、キャッシュやセッションの置き場、ランキングなどに使われます。
| 誕生 | 2009年 |
|---|---|
| 作った人・組織 | Salvatore Sanfilippo(antirez)。現在は Redis 社(旧 Redis Labs)が開発を主導しています |
| 種類 | インメモリのキーバリューストア |
| ライセンス | 7.2 までは BSD ライセンス。2024年の 7.4 から RSALv2 と SSPLv1 のデュアルライセンスに変わり、2025年の Redis 8 で AGPLv3 も選べるようになりました |
| 得意なこと | 文字列・ハッシュ・リスト・セット・ソート済みセットといったデータ構造を、メモリ上でとても速く読み書きできることです。 |
| 手元で動かすには | redis-cli |
日本での使われ方
- データベースの読み込み結果を一時的に置いておくキャッシュとして、Web サービスの裏側でよく使われています。
- ログイン中の利用者のセッション情報の置き場として使われ、複数のサーバーで同じセッションを共有できます。
- ソート済みセットを使うと、ゲームのスコアや人気順のランキングを手軽に作れます。
- INCR と有効期限(EXPIRE)を組み合わせて、一定時間あたりのアクセス回数を数える流量制限(レート制限)にも使われます。
- リストやストリームを使って、時間のかかる処理を後で順番に片付けるための簡単なキュー(待ち行列)を作ることもあります。
使えるクラウドサービス
- Amazon ElastiCache:AWS が提供するマネージドのキャッシュサービスで、Redis(と互換の Valkey)を選べます。
- Amazon MemoryDB:AWS が提供する Redis 互換のインメモリデータベースで、データを複数のアベイラビリティーゾーンに永続化します。
- Google Cloud Memorystore:Google Cloud が提供するマネージドのインメモリサービスで、Redis を扱えます。
- Azure Cache for Redis:Microsoft Azure が提供するマネージドの Redis です。
- Redis Cloud:Redis 社自身が提供するマネージドの Redis です。
- Upstash:リクエスト単位の料金で使えるサーバーレスの Redis 互換サービスです。
研修・学習での位置づけ
Redis は、RDB の次に「SQL を使わないデータベース(NoSQL)」の考え方を学ぶ題材としてよく使われます。表と WHERE で後から自由に問い合わせる RDB と違い、どんな問い合わせをするかを先に決めて、それに合うキーとデータ構造を設計する点が大きな違いです。2024年のライセンス変更を受けて、Linux Foundation のもとで BSD ライセンスのまま続く派生版 Valkey も作られました。Redis 社には開発者向けの認定(Redis Certified Developer)がありましたが、現在の実施状況はこのページでは確かめられていないため、受ける場合は公式サイトで確認してください。
関わる資格
このデータベース専用の資格は、確認できた範囲ではありません。
ブラウザでRedisを動かす
redis-cli に打つコマンドを、このページの中で再現して動かします。本物の Redis ではありませんが、表示は本物の redis-cli と同じになるように作り、照合しています。書いたコマンドは端末の外には出ません。
HGETALL product:1 ZREVRANGE products:by_price 0 2 WITHSCORES
HSET product:1 name apple category fruit price 150 HSET product:2 name mikan category fruit price 80 HSET product:3 name milk category drink price 200 HSET product:4 name tea category drink price 120 HSET product:5 name bread category bakery price 250 ZADD products:by_price 150 1 80 2 200 3 120 4 250 5 SADD category:fruit 1 2 SADD category:drink 3 4 SADD category:bakery 5 HSET order:1 product_id 1 qty 3 ordered_on 2026-10-01 HSET order:2 product_id 3 qty 1 ordered_on 2026-10-01 HSET order:3 product_id 2 qty 5 ordered_on 2026-10-02 HSET order:4 product_id 1 qty 2 ordered_on 2026-10-03 HSET order:5 product_id 4 qty 4 ordered_on 2026-10-03
結果
「実行」を押すと、準備のデータ(下の「準備(全お題共通)」)を入れてから、エディタのコードを流します。
この練習場でできること・できないこと
- 本物の Redis ではなく、文字列・リスト・ハッシュ・集合・ソート済み集合と有効期限のよく使うコマンドを再現したものです。対応していないコマンドは「unknown command」になります(本物には有るものも含みます)。
- 表示は Redis 7.0.15 の redis-cli(対話で打ったとき)と同じ形です。日本語の値は redis-cli と同じく \xe3… のようにバイトで表示されます。
- 文字列の集合を SMEMBERS で並べたときの順番は、本物でも決まっていません(再現では入れた順に出ます)。
- データはこのページを開いている間だけ続きます。永続化・レプリケーション・Pub/Sub・トランザクション(MULTI)は再現していません。
そもそも Redis とは
データをメモリに置いて、とにかく速く返す、キーと値のデータベース。
Redis(レディス)は、SQL を使わないNoSQLのうち、キー・バリュー型のデータベースです。名前(キー)をつけて値を入れ、そのキーで取り出します。データを主にメモリの上に置くので、読み書きがとても速いのが特徴です。値には文字列のほか、リスト・ハッシュ・集合・ソート済み集合といった形も使えます。
PostgreSQL や MySQL のように表を作って SQL で問い合わせる RDB とは考え方が違い、主役のデータベースの横で併用されることが多い道具です。メモリだけでなく、ディスクへ保存する機能もあります。MongoDB のように入れ子の文書を扱うのではなく、単純な形のデータを高速に扱います。
どこで・どんな場面で使うか
-
キャッシュ
何度も読むデータを一時的に置いておき、メインのデータベースへの問い合わせを減らして画面を速くします。
-
ログイン状態(セッション)の保存
ログイン中のユーザーの情報を、期限つきで短時間だけ持つのに向いています。
-
ランキング
ソート済み集合を使うと、得点順の並びを素早く更新・取得できます。
-
処理待ちの行列(キュー)
メール送信など、あとで順番に処理する仕事を並べておく用途にも使われます。
-
求人での位置づけ
バックエンドやインフラの募集で、RDB と並んで名前が出ます。
向いている場面・向いていない場面
- 向いている場面:素早い読み書きが大事な短い値、期限つきのデータ、ランキングや行列。
- 向いていない場面:大量のデータを全部置く用途(容量はメモリに左右されます)や、複雑な条件での検索・集計。これは RDB が得意です。
- 併用が基本。メインのデータベース+Redis という組み合わせを知っておくと、Web サービスの構成が読めるようになります。
上の練習場では、redis-cli のコマンドの動きをブラウザの中で再現して試せます(本物の Redis ではありません)。下のお題のコマンドを流して、結果を確かめてみてください。
6つのお題をRedisで書く
PostgreSQL・MySQL・DuckDB・MongoDB・Redis の5ページで、同じ商品と注文のデータに同じ6つのお題を並べています。SQL の方言の違いや、SQL を使わないデータベースでの考え方の違いがそのまま比べられます。
上の練習場は本物の Redis ではなく、よく使うコマンドの動きを再現したものです。表示している結果は、Redis 7.0.15 で redis-cli に実際に流した表示と、練習場の再現の表示の両方が一字一句同じになることを確かめています。
準備(全お題共通)データを入れるコード。お題2〜6・クイズ・エラーの例は、これを流した後に続けて流した結果です。
HSET product:1 name apple category fruit price 150 HSET product:2 name mikan category fruit price 80 HSET product:3 name milk category drink price 200 HSET product:4 name tea category drink price 120 HSET product:5 name bread category bakery price 250 ZADD products:by_price 150 1 80 2 200 3 120 4 250 5 SADD category:fruit 1 2 SADD category:drink 3 4 SADD category:bakery 5 HSET order:1 product_id 1 qty 3 ordered_on 2026-10-01 HSET order:2 product_id 3 qty 1 ordered_on 2026-10-01 HSET order:3 product_id 2 qty 5 ordered_on 2026-10-02 HSET order:4 product_id 1 qty 2 ordered_on 2026-10-03 HSET order:5 product_id 4 qty 4 ordered_on 2026-10-03
redis-cli
HSET product:1 name apple category fruit price 150 HSET product:2 name mikan category fruit price 80 HSET product:3 name milk category drink price 200 HSET product:4 name tea category drink price 120 HSET product:5 name bread category bakery price 250 ZADD products:by_price 150 1 80 2 200 3 120 4 250 5 SADD category:fruit 1 2 SADD category:drink 3 4 SADD category:bakery 5 HSET order:1 product_id 1 qty 3 ordered_on 2026-10-01 HSET order:2 product_id 3 qty 1 ordered_on 2026-10-01 HSET order:3 product_id 2 qty 5 ordered_on 2026-10-02 HSET order:4 product_id 1 qty 2 ordered_on 2026-10-03 HSET order:5 product_id 4 qty 4 ordered_on 2026-10-03 HGETALL product:1
結果
(integer) 3 (integer) 3 (integer) 3 (integer) 3 (integer) 3 (integer) 5 (integer) 2 (integer) 2 (integer) 1 (integer) 3 (integer) 3 (integer) 3 (integer) 3 (integer) 3 1) "name" 2) "apple" 3) "category" 4) "fruit" 5) "price" 6) "150"
Redis には表がなく、「キー → 値」の組を入れていきます。ここでは商品1件を product:1 のようなキーのハッシュ(項目名と値の組の集まり)にし、価格順の索引としてソート済みセット products:by_price、カテゴリごとの集合 category:fruit などを自分で作っています。値はすべて文字列として保存されます。日本語の値も保存できますが、redis-cli は "\xe3\x82\x8a…" のようにバイト単位でエスケープして表示するため、このページでは英字の値を使っています。
同じお題をほかのデータベースで: PostgreSQL・MySQL・DuckDB・MongoDB
redis-cli
ZRANGEBYSCORE products:by_price 100 +inf HGET product:4 name HGET product:1 name HGET product:3 name HGET product:5 name
結果
1) "4" 2) "1" 3) "3" 4) "5" "tea" "apple" "milk" "bread"
Redis には WHERE がなく、ハッシュの中身を条件で探す命令もありません。「価格で絞り込む」と決めているから、あらかじめ価格をスコアにしたソート済みセットを作っておき、ZRANGEBYSCORE で 100 以上(+inf は上限なし)の商品 ID を取り出します。名前はその ID を使ってハッシュから読みます。後から別の条件で探したくなったら、そのための索引を書き込みのたびに作っておく必要があります。
同じお題をほかのデータベースで: PostgreSQL・MySQL・DuckDB・MongoDB
redis-cli
SCARD category:fruit SCARD category:drink SCARD category:bakery HINCRBY qty_by_product 1 3 HINCRBY qty_by_product 1 2 HGET qty_by_product 1
結果
(integer) 2 (integer) 2 (integer) 1 (integer) 3 (integer) 5 "5"
GROUP BY のように、たまったデータを後から数え直す命令はありません。カテゴリごとの件数は、カテゴリごとのセットを作っておけば SCARD で数えられます。商品ごとの販売数のような合計は、注文を書き込むたびに HINCRBY や INCR でカウンターを増やしておき、読むときはその値を見るだけにする、という作り方をします。
同じお題をほかのデータベースで: PostgreSQL・MySQL・DuckDB・MongoDB
redis-cli
HGETALL order:4 HMGET product:1 name price
結果
1) "product_id" 2) "1" 3) "qty" 4) "2" 5) "ordered_on" 6) "2026-10-03" 1) "apple" 2) "150"
JOIN はありません。まず注文のハッシュを読み、そこに入っている product_id(ここでは 1)を使って product:1 を読む、という2回の問い合わせになります。2つを組み合わせて「apple を 2 個・300 円」とまとめるのはアプリケーション側の仕事です。よく一緒に読む値は、注文のハッシュに商品名も書いておく(重複を許す)設計もよく使われます。
同じお題をほかのデータベースで: PostgreSQL・MySQL・DuckDB・MongoDB
redis-cli
ZREVRANGE products:by_price 2 3 WITHSCORES
結果
1) "1" 2) "150" 3) "4" 4) "120"
ソート済みセットはスコアの順に並んでいるので、何番目から何番目までと位置(0 から数える)で取り出せます。ZREVRANGE は大きい順で、1ページ2件の2ページ目は 2 番目から 3 番目です(終わりの位置も含みます)。WITHSCORES を付けると、メンバー(商品 ID)とスコア(価格)が交互に返ります。
同じお題をほかのデータベースで: PostgreSQL・MySQL・DuckDB・MongoDB
redis-cli
HSET product:2 price 90 HSET product:6 name banana category fruit price 100 ZADD products:by_price 90 2 100 6 HGETALL product:2 HSETNX product:1 price 999 SET coupon:spring 10 NX SET coupon:spring 20 NX GET coupon:spring
結果
(integer) 0 (integer) 3 (integer) 1 1) "name" 2) "mikan" 3) "category" 4) "fruit" 5) "price" 6) "90" (integer) 0 OK (nil) "10"
SET や HSET は、キーや項目があれば上書き、無ければ追加するのが標準の動きです。HSET の戻り値は新しく増えた項目の数なので、価格を変えただけのときは 0 になります。ZADD も同じで、既にあるメンバーはスコアだけ更新されます(戻り値は新しく増えた数)。逆に「無いときだけ入れる」には SET の NX や HSETNX を使い、既にあれば何もせず (nil) や 0 を返します。
同じお題をほかのデータベースで: PostgreSQL・MySQL・DuckDB・MongoDB
出力当てクイズ
準備のデータを入れた後に流したときの、最後のコマンドの結果を選んでください。選ぶと正解と理由が出ます(答えはどこにも送られず、記録もしません)。
問1
SET visits 10 INCR visits
画面に出るのは?
Redis の値は文字列ですが、整数として読める文字列なら INCR で1増やせます。返事は増やした後の値で、整数の返事として (integer) 11 と表示されます。GET visits で読むと "11" という文字列で返ります。
問2
SET greeting hello APPEND greeting world
画面に出るのは?
APPEND は値の後ろに文字列を付け足し、付け足した後の長さ(バイト数)を返します。hello と world で 10 です。付け足した後の値そのものは返りません。
問3
LPUSH queue a b c LRANGE queue 0 0
画面に出るのは?
LPUSH は左(先頭)に1つずつ入れるため、a、b、c の順に入れると先頭は最後に入れた c になります。入れた順に並べたいときは右(末尾)に入れる RPUSH を使います。
問4
SET token abc TTL token
画面に出るのは?
TTL は残り秒数を返しますが、有効期限を付けていないキーには -1 を返します。キー自体が無いときは -2 です。EXPIRE token 60 のように期限を付けると、残り秒数が返るようになります。
よくあるエラーと直し方
書き始めの人が出会いやすいエラーです。メッセージは英語のまま出るので、どの言葉を手がかりにすればよいかもあわせて載せています。
型の違うキーに命令した
エラーになるコード
GET product:1
画面に出るメッセージ(抜粋)
(error) WRONGTYPE Operation against a key holding the wrong kind of value
何が起きているか:product:1 はハッシュなのに、文字列を読む GET を使ったためです。Redis の命令はデータ構造ごとに分かれています。
直し方:TYPE product:1 で型を確かめ、ハッシュなら HGET や HGETALL を使います。
数でない値を増やそうとした
エラーになるコード
SET word apple INCR word
画面に出るメッセージ(抜粋)
(error) ERR value is not an integer or out of range
何が起きているか:INCR は整数として読める文字列にしか使えません。apple は整数として読めないためエラーになりました。
直し方:カウンターに使うキーには数だけを入れます。小数を足したいときは INCRBYFLOAT を使います。
引数の数が違う
エラーになるコード
GET
画面に出るメッセージ(抜粋)
(error) ERR wrong number of arguments for 'get' command
何が起きているか:GET には読むキーを1つ渡す必要がありますが、何も渡していませんでした。
直し方:GET product_name のようにキーを付けます。複数のキーを一度に読むときは MGET を使います。
命令の名前を間違えた
エラーになるコード
HGETAL product:1
画面に出るメッセージ(抜粋)
(error) ERR unknown command 'HGETAL', with args beginning with: 'product:1'
何が起きているか:HGETALL を HGETAL と書き間違えたため、Redis が知らない命令として扱いました。
直し方:命令の綴りを見直します。redis-cli では命令を打つ途中で引数のヒントが表示されるので、それも手がかりになります。
ほかのデータベースの解説
- PostgreSQL 1986年にカリフォルニア大学バークレー校で始まった研究プロジェクト POSTGRES が元で・リレーショナルデータベース
- MySQL 1995年・リレーショナルデータベース
- DuckDB 2019年・組み込み型の分析用
- MongoDB 2009年・ドキュメント指向データベース
5つのデータベースと SQLite を並べた比較は データベースを整える にあります。 書いたコードはどこにも送られません(このページに入力欄はクイズの選択だけで、選んだ答えも記録しません)。
このツールについて
データをメモリに置いて高速に読み書きするキーバリューストアで、キャッシュやセッションの置き場、ランキングなどに使われます。
Redis の概要と、同じ6つのお題をキーとデータ構造の考え方で。コマンドを再現した練習場の表示は本物の redis-cli と同じです。
主な機能
- 概要(誕生・作った人・種類・ライセンス)と日本での使われ方・クラウドサービス・研修と資格
- 同じ商品と注文のデータで6つのお題(PostgreSQL・MySQL・DuckDB・MongoDB の同じお題へ移れる)
- 出力当てクイズ4問(正解と理由)
- よくあるエラー4件(実際のメッセージ・原因・直し方)
- よく使うコマンドを再現した練習場(表示は Redis 7.0.15 の redis-cli と照合済み)
- 送信ゼロ
よくある質問
Q. 練習場では本物の Redis が動いているのですか?
A. 動いていません。Redis はブラウザの中で動かせないため、文字列・リスト・ハッシュ・集合・ソート済み集合と有効期限のよく使うコマンドを再現しています。解説のコードはどれも、本物の Redis 7.0.15 の redis-cli と再現の両方で流し、表示が一字一句同じになることを確かめています。
Q. 日本語の値が \xe3\x81… のように表示されるのはなぜですか?
A. redis-cli は値をバイト列として扱い、表示できない文字を \xNN の形で出すためです。値そのものは壊れていません。redis-cli に --raw を付けると、そのままの文字で表示されます。
Q. Redis で WHERE や JOIN のような問い合わせはできますか?
A. SQL のような問い合わせの言葉はありません。あとで聞きたい問いに合わせて、ソート済み集合や集合を「索引」として自分で用意しておき、キーを指定して読み出します。複数のデータを組み合わせるのは、アプリケーションの側の仕事になります。
入力値はURLの「#」以降に入るためサーバーには送信されません。リンクを開くと同じ状態を復元します。
続けて整える
データの時点:各ページに記載の版(各プロジェクトの公式リリース)