Эффективные операции с индексами в Redis - PullRequest
3 голосов
/ 19 июня 2011

Я пытаюсь создать набор индексов в Redis для выполнения операций AND.

как это:

inx: цвет волос: блондинка = установлено (key1, key2, key3)
inx: eyecolor: blue = set (key1, key2)

И я могу использовать sinter, чтобы найти все ключи со светлыми волосами и голубыми глазами.

У меня есть такие хеши:

key1: имя = цвет волос Рика = цвет глаз блондинки = синий

Какой самый быстрый способ получить полученные ключи и получить соответствующие хеши.

Это просто демонстрационные данные, чтобы их было легче понять, я использую их для хранения аналитики, и мне нужно было бы сделать несколько больших наборов поиска ключей.

2 варианта, которые я могу придумать, - это конвейерная передача multi gets + exec или используя сценарии Lua, чтобы не посылать связку ключей по проводам.

Если есть какой-то лучший способ хранить данные объекта и индексировать его ИЛИ эффективный способ получить все эти хеши без отправки пачки идентификаторов по сети ... пожалуйста, заполните меня!

Редактировать

Я использовал скрипты LUA (используя ветку скриптов redis)

local fkeys = redis.call('sinter', unpack(KEYS))
local r = {}
for i, key in ipairs(fkeys) do
  r[#r+1] = redis.call('hgetall',key)
end
return r

Который сохраняет всю обработку на стороне БД.

1 Ответ

3 голосов
/ 19 июня 2011

Получение списка ключей, а затем выполнение каких-либо действий для получения значений - практически единственный способ справиться с этим.Это похоже на хороший вариант использования для экспериментального сценария Lua, хотя даже без этого вы, вероятно, сможете получить ключи достаточно эффективно - цифры должны быть действительно большими, прежде чем вы увидите реальные проблемы с производительностью.

Вероятно, вы можете выполнить дополнительную оптимизацию, возможно, используя временные или отсортированные наборы или извлекая только одно релевантное свойство из каждого хэша, но они сильно зависят от типа данных, которые вы пытаетесь получить.

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