Перейти к основному содержимому

Удалить все в Redis

· 4 мин. чтения

Задача: Наибольшая подстрока без повторений

Для заданной строки s, найдите длину наибольшей подстроки без повторяющихся символов. Подстрока — это непрерывная непустая последовательность символов внутри строки...

ANDROMEDA 42

1. Обзор

При кэшировании в Redis может быть полезно очистить весь кеш, когда он станет недействительным.

В этом кратком руководстве мы узнаем, как удалить все ключи, присутствующие в Redis, как в определенных базах данных, так и во всех базах данных.

Во-первых, мы рассмотрим командную строку. Затем мы увидим, как сделать то же самое с помощью API и клиента Java.

2. Запуск Redis

Для работы нам понадобится установка Redis. Инструкции по установке для Mac и Linux есть в кратком руководстве по Redis . Вероятно, проще запустить 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

Мы выходим из redis-cli с помощью CTRL+C.

3. Команды Redis

Давайте начнем с команд Redis, чтобы удалить все.

Есть две основные команды для удаления ключей, присутствующих в Redis: FLUSHDB и FLUSHALL . Мы можем использовать Redis CLI для выполнения этих команд.

Команда FLUSHDB удаляет ключи в базе данных. А команда FLUSHALL удаляет все ключи во всех базах данных.

Мы можем выполнять эти операции в фоновом потоке, используя опцию ASYNC . Это полезно, если сброс занимает много времени, так как выполнение команды ASYNC предотвращает его блокировку до его завершения.

Следует отметить, что опция ASYNC доступна в Redis 4.0.0.

4. Работа с Java-клиентом

Теперь давайте посмотрим, как использовать Java- клиент Jedis для удаления ключей.

4.1. Зависимости

Во-первых, нам нужно добавить зависимость Maven для Jedis :

<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);

Затем создается наш клиент Jedis с именем хоста localhost и тем же портом:

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");

Теперь у нас должно быть по одному ключу в каждой из наших двух баз данных:

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. Заключение

В этой статье мы увидели, как запускать Redis и redis-cli в Docker и как использовать клиент Jedis для Java со встроенным сервером Redis.

Мы увидели, как хранить данные в разных базах данных Redis и как использовать команды очистки для очистки одной или нескольких из них.

Как всегда, исходный код этой статьи доступен на GitHub .