はじめに
Redisは、オープンソースのインメモリキーバリューデータストアです。 キーバリューデータストアは、キーがそれに関連する値の一意の識別子として機能するNoSQLデータベースの一種です。各Redisインスタンスには、さまざまなデータ型の多くの異なるキーを保持できるデータベースが含まれます。
このチュートリアルでは、データベースの選択方法、データベース間でのキーの移動、およびキーの管理と削除の方法について学びます。
このガイドの使用方法
このガイドは、独立した例を含むチートシートとして記述されています。完了したいタスクに関連するセクションに直接移動することをお勧めします。
このガイドで示されたコマンドは、Redisバージョン6.0.16を実行しているUbuntu 22.04サーバーでテストされました。同様の環境をセットアップするには、「Ubuntu 22.04でRedisをインストールしてセキュアにする方法」ガイドのステップ1に従ってください。これらのコマンドの動作を示すために、Redisコマンドラインインターフェースであるredis-cli
を使用して実行します。ただし、異なるRedisインターフェース(例:Redli)を使用している場合、特定のコマンドの出力が異なる場合があります。
または、これらのコマンドをテストするために管理されたRedisデータベースインスタンスをプロビジョニングすることもできますが、データベースプロバイダーが許可する制御レベルによっては、このガイドの一部のコマンドが説明どおりに動作しない場合があります。DigitalOceanのManaged Databaseをプロビジョニングするには、Managed Databases製品のドキュメントに従ってください。その後、Managed DatabaseにTLS経由で接続するために、Redliをインストールするか、TLSトンネルを設定する必要があります。
データベースの管理
Redisインスタンスは、初期状態では16個の論理データベースをサポートしています。これらのデータベースは互いに隔離されており、1つのデータベースでコマンドを実行しても、Redisインスタンスの他のデータベースに格納されているデータには影響しません。
Redisのデータベースは、0
から15
までの番号が割り当てられており、デフォルトではRedisインスタンスに接続するとデータベース0
に接続されます。ただし、接続後にselect
コマンドを使用して使用するデータベースを変更することができます:
- select 15
データベース0
以外のデータベースを選択した場合、redis-cli
のプロンプトに反映されます:
-
1つのデータベースに格納されているすべてのデータを別のデータベースにスワップする場合は、swapdb
コマンドを使用します。次の例では、データベース6
に格納されているデータをデータベース8
とスワップし、いずれのデータベースに接続しているクライアントも即座に変更を反映できます:
- swapdb 6 8
swapdb
は、スワップが成功した場合にOK
を返します。
キーを別のRedisインスタンスに移動する場合は、migrate
コマンドを実行します。このコマンドでは、キーが対象のインスタンスに存在することを確認してから、元のインスタンスから削除します。migrate
を実行する際には、次の要素をこの順序で含める必要があります:
- 対象データベースのホスト名またはIPアドレス
- 対象データベースのポート番号
- 移行したいキーの名前
- キーを対象インスタンスのどのデータベースに格納するかのデータベース番号
- 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
さらに、migrate
はタイムアウト引数の後に追加できる以下のオプションを提供します:
COPY
:キーをソースインスタンスから削除しないように指定しますREPLACE
:キーが既に宛先に存在する場合、migrate
操作で削除して置き換えるように指定しますKEYS
:特定のキーを移行する代わりに、空の文字列(""
)を入力し、keys
コマンドの構文を使用してパターンに一致するキーを移行します。keys
の動作についての詳細は、Redis の問題のトラブルシューティング方法のチュートリアルを参照してください。
キーの管理
どの種類のデータを保持しているかに関係なく、キーを管理するために便利ないくつかの Redis コマンドがあります。これらのコマンドの一部については、次のセクションで説明します。
rename
コマンドは指定されたキーの名前を変更します。成功した場合、OK
を返します:
- rename old_key new_key
randomkey
コマンドを使用して、現在選択されているデータベースからランダムなキーを返すことができます。
- randomkey
Output"any_key"
type
コマンドを使用して、指定されたキーが保持するデータのタイプを判断します。このコマンドの出力は、string
、list
、hash
、set
、zset
、またはstream
のいずれかです。
- type key_1
Output"string"
指定されたキーが存在しない場合、type
は代わりにnone
を返します。
move
コマンドを使用して、Redisインスタンス内の個々のキーを別のデータベースに移動することができます。 move
は、キーの名前と移動先のデータベースを引数として受け取ります。たとえば、キーkey_1
をデータベース8
に移動するには、以下を実行します:
- move key_1 8
move
は、キーの移動が成功した場合にOK
を返します。
キーの削除
任意のデータタイプの1つまたは複数のキーを削除するには、del
コマンドに続けて削除したい1つ以上のキーを指定します:
- del key_1 key_2
このコマンドがキーを正常に削除した場合、(integer) 1
を返します。それ以外の場合、(integer) 0
を返します。
unlink
コマンドは、del
と同様の機能を持ちますが、del
はサーバーがキーに占有されているメモリを回収する際にクライアントをブロックします。削除されるキーが小さなオブジェクトに関連付けられている場合、del
がメモリを回収するのにかかる時間は非常に短く、ブロック時間さえも気づかれないかもしれません。
ただし、たとえば削除するキーが多数のオブジェクトに関連付けられている場合、例えば数千または数百万のフィールドを持つハッシュの場合、不便になることがあります。このようなキーを削除すると、かなりの時間がかかり、サーバーのメモリから完全に削除されるまで他の操作を実行することができません。
unlink
は、まずキーによって占有されているメモリの解放コストを決定します。コストが小さい場合、unlink
はdel
と同じようにキーをすぐに削除し、クライアントをブロックします。ただし、キーのメモリを解放するためのコストが高い場合、unlink
は別のスレッドを作成して非同期にキーを削除し、バックグラウンドでメモリを段階的に回収します。
- unlink key_1
バックグラウンドで実行されるため、クライアントでエラーを減らすためには一般的にunlink
を使用してキーを削除することを推奨しますが、多くの場合はdel
でも十分です。
警告:次の2つのコマンドは危険と見なされます。flushdb
コマンドとflushall
コマンドは、それぞれ単一のデータベースおよびRedisサーバーのすべてのデータベースのキーを取り消し不能に削除します。データベースまたはサーバーのすべてのキーを削除することを絶対に確信している場合にのみ、これらのコマンドを実行することを推奨します。
これらのコマンドを誤って実行される可能性の低い名前に変更することが望ましいかもしれません。
選択したデータベース内のすべてのキーを削除するには、flushdb
コマンドを使用します:
- flushdb
Redisサーバー上のすべてのデータベース(現在選択されているデータベースも含む)のすべてのキーを削除するには、flushall
を実行します:
- flushall
flushdb
とflushall
は、async
オプションを受け入れます。これにより、単一のデータベースまたはクラスタ内のすべてのデータベースでキーを非同期に削除することができます。これにより、unlink
コマンドと同様の動作が可能となり、バックグラウンドでメモリを徐々に解放するための新しいスレッドが作成されます。
データベースのバックアップ
現在選択されているデータベースのバックアップを作成するには、save
コマンドを使用します:
- save
これにより、現在のデータセットのスナップショットが.rdb
ファイルとしてエクスポートされます。このファイルは、データを内部の圧縮シリアル化形式で保持するデータベースダンプファイルです。
save
コマンドは同期的に実行され、データベースに接続している他のクライアントをブロックします。そのため、save
コマンドのドキュメントでは、このコマンドはほとんどの場合、本番環境で実行しないことを推奨しています。代わりに、bgsave
コマンドを使用することを提案しています。これにより、Redisはデータベースをフォークし、親プロセスはクライアントに対応し続け、子プロセスはデータベースを保存して終了します。
- bgsave
なお、bgsave
操作が行われている間にクライアントがデータを追加または変更すると、これらの変更はスナップショットには反映されません。
また、Redisの設定ファイルを編集して、Redisが一定時間ごとに自動的にスナップショット(スナップショットまたはRDBモードとも呼ばれる)を保存するようにすることもできます。これはセーブポイントとして知られています。次のセーブポイントの設定は、redis.conf
ファイルでデフォルトで有効になっています:
. . .
save 900 1
save 300 10
save 60 10000
. . .
dbfilename "nextfile.rdb"
. . .
これらの設定により、Redisは少なくとも1つのキーが変更された場合は900秒ごとにデータベースのスナップショットをdbfilename
パラメータで指定されたファイルにエクスポートし、少なくとも10個のキーが変更された場合は300秒ごと、10000個のキーが変更された場合は60秒ごとにエクスポートします。
shutdown
コマンドを使用してRedisデータをバックアップし、接続を閉じることもできます。このコマンドはデータベースに接続しているすべてのクライアントをブロックし、少なくとも1つのセーブポイントが設定されている場合はsave
操作を実行し、データベースの現在の状態を.rdb
ファイルにエクスポートします。
さらに、shutdown
コマンドは、append-onlyモードが有効になっている場合、Redisの追記専用ファイルに変更をフラッシュしてから終了します。 追記専用ファイルモード(AOF)では、スナップショット後にサーバー上のすべての書き込み操作のログを.aof
で終わるファイルに作成します。 AOFモードとRDBモードは同じサーバーで有効にすることができ、両方の永続化方法を使用することはデータをバックアップする効果的な方法です。
要するに、shutdown
コマンドは本質的にブロッキングsave
コマンドであり、最近の変更を追記専用ファイルにフラッシュし、Redisインスタンスへの接続を閉じるものです:
警告: shutdown
コマンドは危険なコマンドです。 Redisサーバーのクライアントをブロックすることにより、データを使用するユーザーやアプリケーションの利用ができなくなる可能性があります。 Redisの動作をテストする場合や、Redisサーバーのすべてのクライアントをブロックすることを絶対に確認している場合にのみ、このコマンドを実行することをおすすめします。
実際、このコマンドの実行が誤って行われる可能性が低い名前に変更することが望ましい場合があります。
- shutdown
セーブポイントを設定していない場合でも、Redisにsave
操作を実行させたい場合は、shutdown
コマンドにsave
オプションを追加します。
- shutdown save
少なくとも1つのセーブポイントを設定している場合にRedisサーバーをセーブせずにシャットダウンしたい場合は、コマンドにnosave
引数を追加することができます:
- shutdown nosave
なお、アペンドオンリーファイルは時間の経過とともに非常に長くなる可能性がありますが、redis.conf
ファイルを編集してRedisが特定の変数に基づいてファイルを再書き込むように設定することもできます。また、bgrewriteaof
コマンドを実行することで、Redisにアペンドオンリーファイルの再書き込みを指示することもできます:
- bgrewriteaof
bgrewriteaof
は、データベースを現在の状態に戻すために必要な最短のコマンドセットを作成します。このコマンドの名前が示すように、バックグラウンドで実行されます。ただし、既にバックグラウンドプロセスで他の永続化コマンドが実行されている場合は、そのコマンドが完了するまでRedisはbgrewriteaof
を実行しません。
まとめ
このガイドでは、データベースとキーの管理に使用されるいくつかのコマンドについて説明しています。このガイドで学びたい他の関連するコマンド、引数、手順がある場合は、コメントで質問または提案をしてください。
Redisコマンドの詳細については、Redisデータベースの管理方法のチュートリアルシリーズをご覧ください。
Source:
https://www.digitalocean.com/community/cheatsheets/how-to-manage-redis-databases-and-keys