Как получить все ключи / значения из redis, чтобы вставить их в базу данных SQL? - PullRequest
0 голосов
/ 05 мая 2018

У меня много аналитических данных, которые я добавляю в Redis. Я планирую постепенно перемещать данные из Redis в свою базу данных.

Я знаю, что могу использовать KEYS [the_key]:*, чтобы получить все подходящие ключи. Например, я могу сделать это, чтобы получить следующее:

127.0.0.1:6379> KEYS c_Track:*
1) "c_Track:6c93a5c1-77e9-4c4a-9232-bf182713a02e"
2) "c_Track:2c9d99c2-af37-4de9-ac64-b48f339e97a9"
3) "c_Track:9e7fd190-86d9-4b4a-9a70-7bf4c7768eef"
4) "c_Track:7f2d2e98-7440-4fd7-a80a-2af309ab15a4"

Есть ли рекомендуемый способ легко получить эти значения? Я могу получить ключи, но как я могу получить все значения? Я могу пройтись по клавишам, чтобы получить значения, но есть ли один-единственный метод для этого?

Также я знаю, что не должен использовать ключи, но это всего лишь пример. Спасибо

Спасибо

1 Ответ

0 голосов
/ 05 мая 2018

Также я знаю, что не должен использовать ключи

Так что не надо. Вместо этого используйте 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 возвращает ключи, которые находятся в пространстве ключей сервера (в одном экземпляре или кластеризованном).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...