Получить все ключи из Redis Cache

Простой и эффективный способ использования в производстве.

Здравствуйте! Поскольку вы читаете этот блог, вы должны уже знать, что такое Redis. Но только для тех, кто не знает. Redis — хорошая альтернатива обычным запросам к БД, если вам нужно мгновенно сохранять и извлекать данные.

Часто бывает так, что вам нужно выполнить какую-то работу, извлекая целые ключи из Redis или, возможно, ключи на основе некоторых шаблонов. В таких случаях Redis предоставляет команду

KEYS *

Здесь * обозначает шаблон, по которому вы хотите фильтровать ключи.

Однако представьте, что произойдет, если Redis будет содержать данные миллионов записей!!

В основном это произойдет,

На время получения всех записей Redis будет недоступен для выполнения каких-либо других операций, а также будет использовать много места в оперативной памяти для буферизации этих записей, что приведет к истощению памяти сервера. Итак, представьте, что вы запускаете эту команду в рабочей среде.

Не волнуйтесь, есть одна хорошая альтернатива этой проблеме, которую можно использовать в продакшене.

scan 0

Команда сканирования предоставляет набор ключей с временной сложностью O(1). Итак, в основном, что он делает, это дает вам список клавиш и курсор для следующего сканирования. Таким образом, вы можете снова использовать команду SCAN с новым курсором для получения следующего набора ключей. Это можно сделать до тех пор, пока возвращаемый курсор не будет равен 0.

Целые ключи извлекаются за время O(n), но за один раз выполняется только операция O(1).

Давайте посмотрим на пример: -

redis 127.0.0.1:6379> scan 0
1) "17"
2)  1) "key:12"
    2) "key:8"
    3) "key:4"
    4) "key:14"
    5) "key:16"
    6) "key:17"
    7) "key:15"
    8) "key:10"
    9) "key:3"
   10) "key:7"
   11) "key:1"
redis 127.0.0.1:6379> scan 17
1) "0"
2) 1) "key:5"
   2) "key:18"
   3) "key:0"
   4) "key:2"
   5) "key:19"
   6) "key:13"
   7) "key:6"
   8) "key:9"
   9) "key:11"

В приведенном выше примере первый вызов использует ноль в качестве курсора, чтобы начать итерацию. Второй вызов использует курсор, возвращенный предыдущим вызовом, в качестве первого элемента ответа, то есть 17.

Как видите, возвращаемое значение SCAN представляет собой массив из двух значений: первое значение — это новый курсор для использования в следующем вызове, второе значение — это массив элементов.

Поскольку во втором вызове возвращаемый курсор равен 0, сервер сигнализирует вызывающей стороне, что итерация завершена и коллекция полностью исследована. Начало итерации со значением курсора, равным 0, и вызов SCAN до тех пор, пока возвращаемый курсор снова не станет равным 0, называется полной итерацией.

Параметры сканирования

Scan принимает четыре параметра.

  1. курсор (Обязательный): - Который начинается с «0
  2. шаблон (необязательно): — для сканирования ключей на основе шаблона.
  3. count (Необязательно): — Чтобы указать, сколько ключей нужно вернуть за один вызов.
  4. тип (необязательно): — указать тип данных ключей для поиска.

Чтобы реализовать Redis Scan в Java с помощью Jedis

Здесь следует отметить, что сканирование гарантирует получение всех ключей, но могут быть случаи, когда ключи повторяются в нескольких сканированиях. Поэтому, чтобы избежать этого, мы используем Set для хранения всех полученных ключей.