Во-первых, самый быстрый способ сделать все это внутри EVAL .
Далее, рекомендуемый подход для итерации всех ключей: SCAN .Он не будет повторяться быстрее, чем KEYS
, но позволит Redis обрабатывать некоторые другие промежуточные действия, поэтому он поможет с общим поведением приложения.
Сценарий будет выглядеть как local data={} local i=1 local mykeys=redis.call(\"KEYS\",\"*\") for k=1,#mykeys do local tmpkey=mykeys[k] data[i]={tmpkey,redis.call(\"GET\",tmpkey)} i=i+1 end return data
, но он будетпотерпеть неудачу, если у вас есть ключи, недоступные с помощью GET (например, наборы, списки).Вам нужно добавить обработку ошибок к нему.Если вам нужна сортировка, вы можете сделать это либо непосредственно в LUA, либо позже на стороне клиента.Второй будет медленнее, но не позволит другим пользователям экземпляра redis ждать.
Пример вывода:
127.0.0.1:6370> eval "local data={} local i=1 local mykeys=redis.call(\"KEYS\",\"*\") for k=1,#mykeys do local tmpkey=mykeys[k] data[i]={tmpkey,redis.call(\"GET\",tmpkey)} i=i+1 end return data" 0
1) 1) "a"
2) "aval"
2) 1) "b"
2) "bval"
3) 1) "c"
2) "cval"
4) 1) "d"
2) "dval"
5) 1) "e"
2) "eval"
6) 1) "f"
2) "fval"
7) 1) "g"
2) "gval"
8) 1) "h"
2) "hval"