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 .