В 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
```
У каждого из этих способов есть свои достоинства и недостатки, и лучший подход зависит от ваших конкретных потребностей и ограничений системы.