Redisデータベースとキーの管理方法
はじめに
Redisはオープンソースでメモリ内にデータを格納するキーバリューデータストアです。キーバリューデータストアは、キーがそれに関連する値の一意の識別子として機能するNoSQLデータベースの一種です。各Redisインスタンスには複数のデータベースが含まれており、それぞれがさまざまなデータ型の多くのキーを保持できます。
このチュートリアルでは、データベースの選択方法、データベース間でのキーの移動、およびキーの管理と削除方法について学びます。
このガイドの使い方
このガイドは、自己完結型の例を使ったチートシートとして書かれています。お使いのタスクに関連するセクションに直接飛んでいただくことをお勧めします。
このガイドで表示されているコマンドは、Redisバージョン6.0.16が実行されているUbuntu 22.04サーバーでテストされました。同様の環境をセットアップするには、「Ubuntu 22.04にRedisをインストールしてセキュリティを確保する方法」のガイドのステップ1に従ってください。これらのコマンドの動作を確認するために、Redisのコマンドラインインターフェースであるredis-cliを使用して実行します。ただし、異なるRedisインターフェース(例えばRedli)を使用している場合、特定のコマンドの出力は異なる場合がありますのでご注意ください。
以下のように日本語で表現することができます:
さらに、これらのコマンドをテストするためには、管理されたRedisデータベースインスタンスを提供することもできますが、データベースプロバイダが許可する制御レベルによっては、このガイドで説明されている通りに機能しない場合があります。Silicon Cloudが提供する管理データベースを利用するには、Managed Databasesの製品ドキュメントに従ってプロビジョニングする必要があります。その後、Redliをインストールするか、TLSトンネルを設定してTLS経由で管理されたデータベースに接続する必要があります。
データベースの管理
Redisインスタンスは、初期設定では16個の論理データベースをサポートしています。これらのデータベースは相互に効果的に分離されており、Redisインスタンス内の他のデータベースに保存されているデータには、1つのデータベースでコマンドを実行しても影響を与えません。
Redisデータベースは、0から15までの番号が付けられており、デフォルトではRedisインスタンスに接続するときはデータベース0に接続します。ただし、接続後にselectコマンドを使用することで、使用するデータベースを変更することができます。
- select 15
もし0以外のデータベースを選択している場合、redis-cliプロンプトに反映されます。
1つのデータベースに保持されているデータを別のデータベースに保持されているデータと交換する場合は、swapdbコマンドを使用します。以下の例では、データベース6に保持されているデータをデータベース8のデータと交換し、どちらかのデータベースに接続しているクライアントは変更をすぐに反映することができます。
- swapdb 6 8
swapdbが成功した場合、OKが返ってきます。
別のRedisインスタンスにキーを移動したい場合は、移行を実行することができます。このコマンドは、ソースインスタンスから削除する前に、対象のインスタンスにキーが存在することを確認します。移行を実行する際には、以下の順序で次の要素を含める必要があります。
- The hostname or IP address of the destination database
- The target database’s port number
- The name of the key you want to migrate
- The database number where you want to store the key on the destination instance
- A timeout, in milliseconds, which defines the maximum amount of idle communication time between the two machines. Note that this isn’t a time limit for the operation, but means that the operation should always make some level of progress within the defined length of time
説明のために、例を挙げます。
- migrate 203.0.113.0 6379 key_1 7 8000
さらに、マイグレーションはタイムアウト引数の後に追加できる以下のオプションを提供しています。
- COPY: Specifies that the key should not be deleted from the source instance
- REPLACE: Specifies that if the key already exists on the destination, the migrate operation should delete and replace it
- KEYS: Instead of providing a specific key to migrate, you can enter an empty string (“”) and then use the syntax from the keys command to migrate any key that matches a pattern. For more information on how keys works, read our tutorial on How To Troubleshoot Issues in Redis.
鍵の管理
さまざまな種類のデータを保持している場合に関係なく、キーを管理するのに便利なRedisコマンドがいくつかあります。以下のセクションでいくつかのコマンドについて説明します。
指定されたキーをリネームします。成功した場合、OKを返します。
- rename old_key new_key
現在選択されているデータベースからランダムなキーを返すために、randomkeyを使用できます。
- randomkey
“any_key”
与えられたキーが保持するデータのタイプを確認するために、タイプを使用します。このコマンドの出力は、文字列、リスト、ハッシュ、セット、ソート済みセット、またはストリームのいずれかです。
- type key_1
“string”
指定されたキーが存在しない場合、typeは代わりにnoneを返します。
Redisのmoveコマンドを使用すると、Redisインスタンス内の個別のキーを別のデータベースに移動することができます。moveコマンドは、移動したいキーの名前と移動先データベースを引数として受け取ります。例えば、キーkey_1をデータベース8に移動するには、以下のコマンドを実行します。
- move key_1 8
移動が成功した場合、moveはOKを返します。
キーの削除
任意のデータ型の1つまたは複数のキーを削除するには、削除したい1つまたは複数のキーの後にdelコマンドを使用してください。
- del key_1 key_2
このコマンドがキー(または複数のキー)を正常に削除した場合、(整数)1 を返します。それ以外の場合は、(整数)0 を返します。
unlinkコマンドは、delと同様の機能を実行しますが、異なる点は、delはサーバーがキーに占有されているメモリを回収する間、クライアントをブロックします。削除されるキーが小さなオブジェクトに関連付けられている場合、delがメモリを回収するのにかかる時間は非常に短く、ブロック時間さえも気づかれないかもしれません。
ただし、例えば削除するキーが何千ものフィールドを持つハッシュのような多数のオブジェクトに関連している場合、それは不便になることがあります。このようなキーを削除するには、かなり長い時間がかかる場合があり、完全にサーバーのメモリから削除されるまで他の操作を行うことができません。
ただし、アンリンクはまず、キーが占有しているメモリの割り当て解除のコストを求めます。もしコストが小さい場合、アンリンクはキーを即座に削除し、またクライアントをブロックします。しかし、あるキーのメモリの解放に高いコストがかかる場合、アンリンクは別のスレッドを作成し、バックグラウンドで徐々にメモリを回収しながらキーを非同期に削除します。
- unlink key_1
バックグラウンドで実行されるため、クライアントのエラーを減らすために、通常、unlinkを使用してサーバーからキーを削除することが推奨されていますが、多くの場合、delも十分です。
Warning
これらのコマンドの名前を、誤って実行される可能性の低いものに変更することが利益になるかもしれません。
選択したデータベース内のすべてのキーを削除するには、flushdbコマンドを使用してください。
- flushdb
全てのデータベース内のキーを削除するには、Redisサーバー上でflushallコマンドを実行します。(現在の選択されたデータベースも含まれます)
- flushall
flushdbとflushallの両方は、asyncオプションを受け入れており、シングルデータベースまたはクラスタ内の全てのデータベースのキーを非同期で削除することができます。これにより、unlinkコマンドと同様の機能を持ち、バックグラウンドでメモリを段階的に解放するために新しいスレッドを作成します。
データベースのバックアップを作成する
現在選択されているデータベースのバックアップを作成するには、saveコマンドを使用できます。
- save
現在のデータセットをスナップショットとしてエクスポートします。.rdbファイル形式で保存され、データを内部の圧縮シリアル化形式で保持するデータベースダンプファイルです。
データベースに接続している他のクライアントに影響を与えるため、同期的に実行され、ブロックされることがあります。そのため、保存コマンドのドキュメントでは、このコマンドはほぼ本番環境では実行しないことを推奨しています。代わりに、bgsaveコマンドを使用することを提案しています。これにより、Redisはデータベースを分岐させます。親プロセスは引き続きクライアントにサービスを提供し、子プロセスはデータベースを保存してから終了します。
- bgsave
クライアントがbgsave操作が行われている間にデータを追加または変更した場合には、その変更内容はスナップショットに反映されないことに注意してください。
Redisの設定ファイルを編集して、特定の時間経過後にRedisが自動的にスナップショット(スナップショットまたはRDBモードとも呼ばれる)を保存するようにすることもできます。これはセーブポイントとして知られています。redis.confファイルで次のセーブポイントの設定がデフォルトで有効になっています。
. . .
save 900 1
save 300 10
save 60 10000
. . .
dbfilename "nextfile.rdb"
. . .
これらの設定では、最低1つのキーが変更された場合、Redisはdbfilenameパラメータで定義されたファイルに900秒ごとにデータベースのスナップショットをエクスポートします。最低10個のキーが変更された場合は300秒ごと、最低10000個のキーが変更された場合は60秒ごとにエクスポートされます。
Redisデータをバックアップし、接続を終了するためにシャットダウンコマンドを使用することができます。このコマンドは、データベースに接続しているすべてのクライアントをブロックし、少なくとも1つの保存ポイントが構成されている場合は保存操作を実行します。つまり、クライアントが変更を加えることを防ぎながら、データベースを現在の状態で.rdbファイルにエクスポートします。
ただし、追記モードが有効になっている場合、シャットダウンコマンドはRedisの追記専用ファイルへの変更を保存した後に終了します。追記専用ファイルモード(AOF)では、スナップショット後にサーバー上のすべての書き込み操作を.aofで終わるファイルに記録します。AOFモードとRDBモードは同じサーバーで有効にすることができ、両方の永続化メソッドを使用することはデータをバックアップする効果的な方法です。
要するに、シャットダウンコマンドとは、基本的にブロッキング保存コマンドであり、また追記専用ファイルへの最近のすべての変更をフラッシュし、Redisインスタンスへの接続を終了するコマンドです。
Warning
実際には、このコマンドの名前を誤って実行される可能性が低いものに変更することがあなたの利益になるかもしれません。
- shutdown
セーブポイントを設定していない場合でも、Redisに保存操作を実行させたい場合は、シャットダウンコマンドにセーブオプションを追加してください。
- shutdown save
少なくとも1つのセーブポイントを設定しているが、セーブを実行せずにRedisサーバーをシャットダウンしたい場合は、コマンドにnosave引数を追加することができます。
- shutdown nosave
追記専用のファイルは、時間の経過とともに非常に長くなる可能性があることに注意してください。ただし、redis.confファイルを編集して特定の変数に基づいてファイルを書き換えるようにRedisを設定することができます。また、bgrewriteaofコマンドを実行することで、Redisに追記専用のファイルを書き換えるように指示することもできます。
- bgrewriteaof
bgrewriteaofコマンドは、データベースを現在の状態に戻すために必要な最短のコマンドセットを作成します。このコマンドの名前が示すように、バックグラウンドで実行されます。ただし、すでにバックグラウンドプロセスで実行中の別の永続化コマンドがある場合、Redisはbgrewriteaofを実行する前にそのコマンドの完了を待ちます。
結論
このガイドでは、データベースとキーを管理するために使用されるいくつかのコマンドについて詳しく説明します。このガイドで学びたい他の関連するコマンド、引数、または手順があれば、コメントでお気軽にお聞きください。
Redisのコマンドに関する詳細は、Redisデータベースを管理する方法についての当社のチュートリアルシリーズをご覧ください。