Также я знаю, что не должен использовать ключи
Так что не надо. Вместо этого используйте SCAN
.
Есть ли какой-то один метод для этого?
Нет, не как основная команда Redis, но, учитывая необходимость, это довольно просто сделать с помощью сценария Lua на стороне сервера. Например, предполагая, что ваши значения являются строками, вы можете сделать что-то вроде следующего:
local cursor = tonumber(ARGV[1])
local pattern = ARGV[2]
local scan = redis.call('SCAN', cursor, 'MATCH', pattern)
for i, v in ipairs(scan[2]) do
local val = redis.call('GET', v)
scan[2][i] = { v, val }
end
return scan
Предполагая, что этот скрипт сохранен в "scan.lua", вы можете запустить его следующим образом:
$ redis-cli SET foo bar
OK
$ redis-cli SET baz qaz
OK
$ redis-cli --eval scan.lua , 0 "*"
1) "0"
2) 1) 1) "baz"
2) "qaz"
2) 1) "foo"
2) "bar"
Чтобы отсканировать все ваше пространство клавиш, вызывайте скрипт с возвращенным курсором, пока он не вернет 0.
Примечания:
1) Если ваши ключи разных типов, вам следует соответствующим образом изменить скрипт (например, https://github.com/itamarhaber/redis-lua-scripts/blob/master/scanfetch.lua).
2) Хотя этот сценарий идет вразрез с общей рекомендацией генерировать имена ключей внутри сценария, его все равно можно безопасно запускать, так как SCAN возвращает ключи, которые находятся в пространстве ключей сервера (в одном экземпляре или кластеризованном).