Как правильно сохранять refresh токены в redis?

Как можно эффективно найти и удалить все рефреш токены для нескольких устройств одного пользователя, хранящиеся в Redis sets? Может быть, существует другой способ, поскольку использование команды KEYS запрещено?
  • 20 декабря 2023 г. 22:57
Ответы на вопрос 2
В Redis не существует непосредственной команды для поиска и удаления набора ключей по шаблону, как KEYS. Однако, вы можете достичь желаемого результата с помощью комбинации различных команд Redis.

Вот несколько способов эффективного поиска и удаления всех refresh токенов для нескольких устройств одного пользователя, хранящихся в Redis sets:

1. Используйте свою собственную логику и храните refresh токены в отдельных Redis sets для каждого пользователя и каждого устройства. Например, ключи могут иметь формат "user:<user_id>:device:<device_id>:refresh_tokens". Затем вам просто нужно удалить соответствующий ключ для каждого устройства.

   ```bash
   DEL user:<user_id>:device:<device_id>:refresh_tokens
   ```

2. Создайте индекс для всех refresh токенов в Redis sets. Например, вы можете создать отдельный set "refresh_tokens_index" для хранения всех refresh токенов в виде элементов set. Используйте значения токенов в качестве ключей set, а их владельцев (например, устройства или пользователи) как значения.

   ```bash
   SADD refresh_tokens_index <refresh_token> <owner_id>
   ```

   Теперь вы можете найти все refresh токены для конкретного владельца, удалив из индекса и соответствующих Redis sets.

   ```bash
   SMEMBERS refresh_tokens_index
   SREM refresh_tokens_index <refresh_token>  # Remove specific token from index
   DEL <owner_id>:refresh_tokens              # Remove tokens for specific owner
   ```

3. Используйте технику "Tagging". При создании ключей Redis добавьте теги (например, "refresh_token") к ключам с уникальными идентификаторами для отслеживания. Затем вы можете использовать команду SCAN для поиска и удаления ключей с определенными тегами.

   Полявяка, ключи могут иметь формат "refresh_token:<token_id>". Добавление тега к ключам будет выглядеть примерно так:

   ```bash
   SET "refresh_token:<token_id>" <refresh_token_value>
   SADD "refresh_token" "refresh_token:<token_id>"
   ```

   Затем вы можете использовать команду SCAN для поиска всех ключей с тегом "refresh_token" и удаления их.

   ```bash
   SCAN 0 MATCH "refresh_token:*" COUNT 100 # Повторяйте пока получаете 0 результатов
   DEL <token_key>
   ```

4. Используйте Lua скрипту, чтобы выполнить операцию поиска и удаления в одном запросе. Lua скрипт может быть выполнен атомарно и безопасно, и он имеет доступ ко всем ключам и значениям Redis.

   Вот пример Lua скрипта, который ищет и удаляет все ключи, соответствующие шаблону "refresh_token:*".

   ```lua
   local keys = redis.call('KEYS', "refresh_token:*")
   for _, key in ipairs(keys) do
       redis.call('DEL', key)
   end
   ```

   Вы можете выполнить этот Lua скрипт в Redis с помощью команды EVAL.

   ```bash
   EVAL "local keys = redis.call('KEYS', 'refresh_token:*'); for _, key in ipairs(keys) do redis.call('DEL', key) end" 0
   ```

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