Valkey ラボ:Redis 互換のキーバリューストアで、キー、有効期限、リスト、カウンターを学ぶ
このラボは、各生徒に専用の Valkey サーバーを渡して、コマンドを打って試させます。Valkey はキーバリューストアで、名前を付けて値を保存し、名前を指定すると返します。Web サイトがセッション、キャッシュ、カウンターに使う仕組みです。Redis と同じコマンドが使えるので、ここで学んだことはそのまま役に立ちます。
攻撃のラボではありません。どのコピーもインターネットにも他の生徒にも通じておらず、Web ページはないので、操作はすべて隣のターミナルで入力します。
生徒が学ぶこと
キーバリューストアが表とどう違うか。SET と GET でキーを指定して値を保存し、取り出すこと。EX でキーに寿命を与え、TTL で残り時間を数えられること。ストアに固有の構造として、リスト(RPUSH、LRANGE)、名前付きの項目をまとめたハッシュ(HSET、HGETALL)、多数のクライアントが同時に操作しても正確に加算するカウンター(INCR)があること。さらにストアの返事、つまり RESP というプロトコルを読み、ラボを停止しても残るものを確かめます。データはメモリに置かれ、書き込みはすべて名前付きボリュームのファイルに記録されるので、元に戻せます。データベースやデータストアの入門、または Web 開発のキャッシュやセッションの単元に向いています。
ブラウザーで動かす
ラボは valkey という 1 つのサービスを起動し、応答するまで待ちます。ターミナルには通常の Valkey クライアントである valkey-cli がありません。そこで授業では、v という 1 行の関数を作り、nc で各コマンドを送ります。返事は届いたままに表示されます。成功は +OK、5 バイトの値は $5 と次の行の文字列、存在しないキーは $-1、数値は :3 です。
- コンテナーのページを開く. バーの「つくる」を開き、「コンテナーを実行」を選びます。ページは誰でも開けて、Git ラボと SQL ラボはアカウントなしで起動できます。ほかのラボには無料アカウントが必要です。アカウントを作成してサインインし、「起動」を押します。
- ラボを探す. 「サンプルラボ」のカードにすべてのサンプルが並んでいます。Valkeyを探します。
- 「起動」を押す. 「起動」はそのまま1回の操作で実行します。「先にファイルを編集」は compose ファイルを開くので、起動する前に変更できます。
- 開く. ラボのページで「ターミナルを開く」を押します。Valkey には Web ページがないので、「ブラウザーで」の下にリンクはありません。nc valkey 6379 と入力し、続けて SET greeting hello と入力して Enter を押すと、ストアが +OK と返します。GET greeting は $5 と hello を返します。授業では関数 v を作るので、先に接続を開かなくても v SET greeting hello で同じことができます。
何を提出させるか
自分で行った短い操作の返事を提出させます。有効期限を付けたキーと数えていく TTL、リスト、ハッシュ、カウンターです。さらに、有効期限が何をしたかを書いた一文と、ラボを停止して起動し直したあとに何が残っていたか、それはなぜかを書いた一文を付けます。最後の一文で、メモリ上のデータとボリューム内のファイルの違いを理解したかが分かります。
このラボの基本レッスン
Valkey Basics は、このラボで進める小さなレッスンです。生徒は関数 v を作り、値を保存して取り出し、キーに 5 秒の寿命を与えて消えるのを確かめ、リスト、ハッシュ、カウンターに追加します。そのあとラボを停止して起動し直し、何が残ったかを確かめます。
無料の個人アカウントには、ホームにある Basics モジュールで配布されます。どの学校もライブラリの Basics フォルダから自分のモジュールにコピーでき、新しい学校ではサンプルモジュールの Lab Basics (Sample) に入っています。意図的に小さくしてあり、ラボで進めるレッスンとは何かを教員に見せるためのもので、残りはラボが担います。変更したい場合は、自分のモジュールにコピーしてください。
GitHub のコード
compose ファイルに Dockerfile はありません。公開されている標準のイメージ valkey/valkey をバージョンを固定して実行し、特権のないユーザー、64 MB のメモリ、名前付きボリューム内の追記専用ファイルを使います。Valkey は BSD-3-Clause ライセンスで、当社は配布していません。Redis のオープンソースのフォークで、ライセンスが異なる Redis 8 以降の代わりに使っています。ラボはインターネットに出られず、ストアに届くものが他にないのでパスワードもありません。サービスは 1 つだけなので、レプリケーションのように 2 台目のサーバーが必要な機能は含まれません。
課題として出す
何を提出するかを、課題に書いておきます。
- ラボを作る. モジュールで課題を追加し、「コンテナーラボ」のカードを選んでから「GitHub リポジトリ」を選びます。https://github.com/mitsurutech/lab-valkey とブランチ main を指定します。compose ファイルは既定の compose.yaml です。変更したい場合は、先にリポジトリをフォークしてください。
- 公開して試す. 「公開」すると、確認したコミットに固定されるので、あとでリポジトリを変更しても、すでに出したラボは変わりません。まず自分のコピーを起動してください。
- 配布する. ほかの課題と同じように配布します。期限を付けることもでき、課題には何をするか、何を提出するかを書いておきます。
- 提出物を採点する. 生徒のコピーを開いて提出された内容を確認し、採点します。足りない場合は理由を書いて差し戻します。
よくある質問
- これは Redis ですか?
- Redis のオープンソースのフォークである Valkey で、同じコマンドに答えます。ラボが Valkey を使うのは BSD-3-Clause ライセンスだからで、Redis 8 以降はそうではありません。
- ターミナルで valkey-cli ではなく nc を使うのはなぜですか?
- ラボのターミナルには psql、mariadb、curl、git、nc があり、Valkey のクライアントはありません。Valkey は 1 行のテキストをコマンドとして受け付けるので、nc で送って返事を表示できます。自分のマシンでは、同じラボに valkey-cli や redis-cli も使えます。
- ラボを停止して起動し直したあとに残るものは何ですか?
- 書き込まれていて、期限が切れていないものです。ストアはすべての書き込みを名前付きボリューム内のファイルに記録し、プラットフォームがそれを保存して、起動時にそこからメモリを作り直します。寿命が尽きたキーは、消えたままです。