#redis
#redis
Вопрос:
Если у меня есть следующие ключи в моем Redis:
Person:1234
Person:1234:email
Person:name:John
Person:lastName:Doe
Я пытаюсь использовать только MATCH
первый ключ SCAN
.
Я пробовал с Person:*
, но это, конечно, возвращает их все. Person:[^:]*
или аналогичные попытки не сработали, я попытался сопоставить все, кроме :
.
Может ли кто-нибудь указать мне правильное направление?
Комментарии:
1. что вы подразумеваете под «первым ключом»? вы имеете в виду лексикографический?
2. Извините, я имел в виду точный
Person:1234
ключ в результате использованияSCAN
операцииMATCH
.
Ответ №1:
Redis scan match поддерживает только соответствие глобальному стилю. Он не может выполнять сопоставление регулярных выражений. Для достижения вашей цели у вас есть два варианта:
- Сканируйте все ключи и выполняйте сопоставление на стороне клиента.
- Используйте сценарий Lua для выполнения сканирования и сопоставления. В качестве примера вы можете попробовать следующий однострочник:
redis-cli eval 'local res = redis.call("scan", ARGV[1]); local matches = {}; for i,v in ipairs(res[2]) do if v == string.match(v, ARGV[2]) then matches[#matches 1] = v end end res[2] = matches; return res' 0 cursor-starting-from-0 'Person:[^:]*'
Эта однострочная строка возвращает результаты точно так же, как встроенная команда сканирования. Я не эксперт по Lua, и код не полностью протестирован.
Кроме того, сопоставление Lua НЕ является сопоставлением регулярных выражений, хотя оно может решить большинство проблем. Вам нужно взять ссылку Lua, чтобы проверить, соответствует ли она вашему случаю.