Автор оригинала: Vivek Balasubramaniam.
1. Обзор
При кэшировании в Redis может быть полезно очистить весь кэш, когда он становится недействительным.
В этом коротком уроке мы узнаем, как удалить все ключи, присутствующие в Redis, как в конкретных базах данных, так и во всех базах данных.
Сначала мы рассмотрим командную строку. Затем мы посмотрим, как сделать то же самое с помощью API и Java-клиента.
2. Запуск Redis
Для работы нам понадобится установка Redis. Инструкции по установке для Mac и Linux содержатся в разделе Redis quick start . Вероятно, проще запустить Redis в docker.
Давайте запустим тестовый сервер 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 и FLUSH ALL . Мы можем использовать CLI Redis для выполнения этих команд.
Команда FLUSHDB удаляет ключи в базе данных. И команда FLUSHALL удаляет все ключи во всех базах данных.
Мы можем выполнять эти операции в фоновом потоке, используя параметр ASYNC . Это полезно, если сброс занимает много времени, так как выполнение команды ASYNC останавливает ее блокировку до тех пор, пока она не будет завершена.
Следует отметить, что опция ASYNC доступна в Redis 4.0.0.
4. Работа с Java-клиентом
Теперь давайте посмотрим, как использовать Java-клиент Jedis для удаления ключей.
4.1. Зависимости
Во-первых, нам нужно будет добавить зависимость Maven для Jedis :
redis.clients jedis 3.3.0
Чтобы упростить тестирование, давайте также используем встроенный сервер Redis :
com.github.kstyrc embedded-redis 0.6
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 очистит только текущую базу данных . Чтобы очистить все базы данных, мы используем метод flush All :
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 и как использовать команды flush для очистки одной или нескольких из них.
Как всегда, исходный код этой статьи доступен на GitHub .