Redisデータベースとキーの管理方法

はじめに

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コマンドを使用して使用するデータベースを変更することができます:

  1. select 15

データベース0以外のデータベースを選択した場合、redis-cliのプロンプトに反映されます:

1つのデータベースに格納されているすべてのデータを別のデータベースにスワップする場合は、swapdbコマンドを使用します。次の例では、データベース6に格納されているデータをデータベース8とスワップし、いずれのデータベースに接続しているクライアントも即座に変更を反映できます:

  1. 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

以下は例を示します:

  1. migrate 203.0.113.0 6379 key_1 7 8000

さらに、migrate はタイムアウト引数の後に追加できる以下のオプションを提供します:

  • COPY:キーをソースインスタンスから削除しないように指定します
  • REPLACE:キーが既に宛先に存在する場合、migrate 操作で削除して置き換えるように指定します
  • KEYS:特定のキーを移行する代わりに、空の文字列("")を入力し、keys コマンドの構文を使用してパターンに一致するキーを移行します。 keys の動作についての詳細は、Redis の問題のトラブルシューティング方法のチュートリアルを参照してください。

キーの管理

どの種類のデータを保持しているかに関係なく、キーを管理するために便利ないくつかの Redis コマンドがあります。これらのコマンドの一部については、次のセクションで説明します。

rename コマンドは指定されたキーの名前を変更します。成功した場合、OK を返します:

  1. rename old_key new_key

randomkey コマンドを使用して、現在選択されているデータベースからランダムなキーを返すことができます。

  1. randomkey
Output
"any_key"

typeコマンドを使用して、指定されたキーが保持するデータのタイプを判断します。このコマンドの出力は、stringlisthashsetzset、またはstreamのいずれかです。

  1. type key_1
Output
"string"

指定されたキーが存在しない場合、typeは代わりにnoneを返します。

moveコマンドを使用して、Redisインスタンス内の個々のキーを別のデータベースに移動することができます。 moveは、キーの名前と移動先のデータベースを引数として受け取ります。たとえば、キーkey_1をデータベース8に移動するには、以下を実行します:

  1. move key_1 8

moveは、キーの移動が成功した場合にOKを返します。

キーの削除

任意のデータタイプの1つまたは複数のキーを削除するには、delコマンドに続けて削除したい1つ以上のキーを指定します:

  1. del key_1 key_2

このコマンドがキーを正常に削除した場合、(integer) 1を返します。それ以外の場合、(integer) 0を返します。

unlinkコマンドは、delと同様の機能を持ちますが、delはサーバーがキーに占有されているメモリを回収する際にクライアントをブロックします。削除されるキーが小さなオブジェクトに関連付けられている場合、delがメモリを回収するのにかかる時間は非常に短く、ブロック時間さえも気づかれないかもしれません。

ただし、たとえば削除するキーが多数のオブジェクトに関連付けられている場合、例えば数千または数百万のフィールドを持つハッシュの場合、不便になることがあります。このようなキーを削除すると、かなりの時間がかかり、サーバーのメモリから完全に削除されるまで他の操作を実行することができません。

unlinkは、まずキーによって占有されているメモリの解放コストを決定します。コストが小さい場合、unlinkdelと同じようにキーをすぐに削除し、クライアントをブロックします。ただし、キーのメモリを解放するためのコストが高い場合、unlinkは別のスレッドを作成して非同期にキーを削除し、バックグラウンドでメモリを段階的に回収します。

  1. unlink key_1

バックグラウンドで実行されるため、クライアントでエラーを減らすためには一般的にunlinkを使用してキーを削除することを推奨しますが、多くの場合はdelでも十分です。

警告:次の2つのコマンドは危険と見なされます。flushdbコマンドとflushallコマンドは、それぞれ単一のデータベースおよびRedisサーバーのすべてのデータベースのキーを取り消し不能に削除します。データベースまたはサーバーのすべてのキーを削除することを絶対に確信している場合にのみ、これらのコマンドを実行することを推奨します。

これらのコマンドを誤って実行される可能性の低い名前に変更することが望ましいかもしれません。

選択したデータベース内のすべてのキーを削除するには、flushdbコマンドを使用します:

  1. flushdb

Redisサーバー上のすべてのデータベース(現在選択されているデータベースも含む)のすべてのキーを削除するには、flushallを実行します:

  1. flushall

flushdbflushallは、asyncオプションを受け入れます。これにより、単一のデータベースまたはクラスタ内のすべてのデータベースでキーを非同期に削除することができます。これにより、unlinkコマンドと同様の動作が可能となり、バックグラウンドでメモリを徐々に解放するための新しいスレッドが作成されます。

データベースのバックアップ

現在選択されているデータベースのバックアップを作成するには、saveコマンドを使用します:

  1. save

これにより、現在のデータセットのスナップショットが.rdbファイルとしてエクスポートされます。このファイルは、データを内部の圧縮シリアル化形式で保持するデータベースダンプファイルです。

saveコマンドは同期的に実行され、データベースに接続している他のクライアントをブロックします。そのため、saveコマンドのドキュメントでは、このコマンドはほとんどの場合、本番環境で実行しないことを推奨しています。代わりに、bgsaveコマンドを使用することを提案しています。これにより、Redisはデータベースをフォークし、親プロセスはクライアントに対応し続け、子プロセスはデータベースを保存して終了します。

  1. bgsave

なお、bgsave操作が行われている間にクライアントがデータを追加または変更すると、これらの変更はスナップショットには反映されません。

また、Redisの設定ファイルを編集して、Redisが一定時間ごとに自動的にスナップショット(スナップショットまたはRDBモードとも呼ばれる)を保存するようにすることもできます。これはセーブポイントとして知られています。次のセーブポイントの設定は、redis.confファイルでデフォルトで有効になっています:

/etc/redis/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サーバーのすべてのクライアントをブロックすることを絶対に確認している場合にのみ、このコマンドを実行することをおすすめします。

実際、このコマンドの実行が誤って行われる可能性が低い名前に変更することが望ましい場合があります。

  1. shutdown

セーブポイントを設定していない場合でも、Redisにsave操作を実行させたい場合は、shutdownコマンドにsaveオプションを追加します。

  1. shutdown save

少なくとも1つのセーブポイントを設定している場合にRedisサーバーをセーブせずにシャットダウンしたい場合は、コマンドにnosave引数を追加することができます:

  1. shutdown nosave

なお、アペンドオンリーファイルは時間の経過とともに非常に長くなる可能性がありますが、redis.confファイルを編集してRedisが特定の変数に基づいてファイルを再書き込むように設定することもできます。また、bgrewriteaofコマンドを実行することで、Redisにアペンドオンリーファイルの再書き込みを指示することもできます:

  1. bgrewriteaof

bgrewriteaofは、データベースを現在の状態に戻すために必要な最短のコマンドセットを作成します。このコマンドの名前が示すように、バックグラウンドで実行されます。ただし、既にバックグラウンドプロセスで他の永続化コマンドが実行されている場合は、そのコマンドが完了するまでRedisはbgrewriteaofを実行しません。

まとめ

このガイドでは、データベースとキーの管理に使用されるいくつかのコマンドについて説明しています。このガイドで学びたい他の関連するコマンド、引数、手順がある場合は、コメントで質問または提案をしてください。

Redisコマンドの詳細については、Redisデータベースの管理方法のチュートリアルシリーズをご覧ください。

Source:
https://www.digitalocean.com/community/cheatsheets/how-to-manage-redis-databases-and-keys