1. 概要

Redisでキャッシュする場合、キャッシュが無効になったときにキャッシュ全体をクリアすると便利です。

この短いチュートリアルでは、特定のデータベースとすべてのデータベースの両方で、Redisに存在するすべてのキーを削除する方法を学習します。

まず、コマンドラインを見てみましょう。 次に、APIとJavaクライアントを使用して同じことを実現する方法を説明します。

2. Redisの実行

使用するには、Redisをインストールする必要があります。 RedisクイックスタートにMacとLinuxのインストール手順があります。 DockerでRedisを実行する方がおそらく簡単です。

テストRedisサーバーを開始しましょう:

docker run --name redis -p 6379:6379 -d redis:latest

また、 redis-cli を実行して、このサーバーが機能していることをテストできます。

docker exec -it redis redis-cli

これにより、cliシェルに移動します。コマンド ping は、サーバーが起動しているかどうかをテストします。

127.0.0.1:6379> ping
PONG

CTRL+Cでredis-cliを終了します。

3. Redisコマンド

すべてを削除するRedisコマンドから始めましょう。

Redisに存在するキーを削除するための2つの主要なコマンドがあります:FLUSHDBとFLUSHALL。 RedisCLIを使用してこれらのコマンドを実行できます。

FLUSHDB コマンドは、データベース内のキーを削除します。 また、 FLUSHALL コマンドは、すべてのデータベースのすべてのキーを削除します。

これらの操作はASYNCオプションを使用してバックグラウンドスレッドで実行できます。コマンドASYNCを実行すると、完了するまでブロックが停止するため、フラッシュに時間がかかる場合に便利です。

ASYNCオプションはRedis4.0.0から利用できることに注意してください。

4. Javaクライアントの操作

それでは、 JedisJavaクライアントを使用してキーを削除する方法を見てみましょう。

4.1. 依存関係

まず、JedisのMaven依存関係を追加する必要があります。

<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>3.3.0</version>
</dependency>

テストを簡単にするために、組み込みRedisサーバーも使用しましょう。

<dependency>
    <groupId>com.github.kstyrc</groupId>
    <artifactId>embedded-redis</artifactId>
    <version>0.6</version>
</dependency>

4.2. 組み込みRedisの開始

使用可能なポートで実行することにより、テスト用の組み込みRedisサーバーを作成します。

RedisService redisServer = new RedisServer(port);

次に、ホスト名として localhost を使用し、同じポートを使用してJedisクライアントを作成します。

Jedis jedis = new Jedis("localhost", port);

5. 単一のデータベースのフラッシュ

いくつかのデータをデータベースに入れて、それが記憶されていることを確認しましょう。

String key = "key";
String value = "value";
jedis.set(key, value);
String received = jedis.get(key);
 
assertEquals(value, received);

次に、flushDBメソッドを使用してデータベースをフラッシュしましょう。

jedis.flushDB();

assertNull(jedis.get(key));

ご覧のとおり、フラッシュ後に値を取得しようとすると、nullが返されます。

6. すべてのデータベースをクリアする

Redisは、番号が付けられた複数のデータベースを提供します。 値を追加する前に、selectコマンドを使用して、さまざまなデータベースにデータを追加できます。

jedis.select(0);
jedis.set("key1", "value1");
jedis.select(1);
jedis.set("key2", "value2");

これで、2つのデータベースのそれぞれに1つのキーが必要になります。

jedis.select(0);
assertEquals("value1", jedis.get("key1"));
assertNull(jedis.get("key2"));

jedis.select(1);
assertEquals("value2", jedis.get("key2"));
assertNull(jedis.get("key1"));

flushDBメソッドは現在のデータベースのみをクリアします。 すべてのデータベースをクリアするには、flushAllメソッドを使用します。

jedis.flushAll();

これが機能したことをテストできます。

jedis.select(0);
 
assertNull(jedis.get("key1"));
assertNull(jedis.get("key2"));
 
jedis.select(1);
 
assertNull(jedis.get("key1"));
assertNull(jedis.get("key2"));

7. 時間計算量

Redisは、拡張性に優れた高速データストアです。 ただし、データが多いほど、フラッシュ操作に時間がかかる場合があります。

FLUSHDB操作の時間計算量O(N)です。ここで、Nはデータベース内のキーの数です。 FLUSHALL コマンドを使用すると、時間計算量は再び O(N)になりますが、ここでは、Nがすべてのデータベースのキーの数です。

8. 結論

この記事では、DockerでRedisと redis-cli を実行する方法と、Redisサーバーが組み込まれたJava用のJedisクライアントを使用する方法について説明しました。

さまざまなRedisデータベースにデータを保持する方法と、flushコマンドを使用して1つ以上のデータベースをクリアする方法を見てきました。

いつものように、この記事のソースコードはGitHubから入手できます。