> Спасибо за код, попробую на тестах, насколько ресурсоемкая операция на
> распаковку кортежа(если будет несколько тыщ, сот, милионов, значений)
> - Можно ли получать из tarantool конкретные поля а не весь кортеж? без lua
> - l.find(3,uid) первый параметр 3 это позиция откуда ищеться?
размер кортежа ограничен ЕМНИП одним мегабайтом
а так же обращение к хвосту кортежа если он очень длинный тоже
накладное.
поэтому не стройте приложения где несколько тысяч записей в кортеже.
лучше тогда нормализовать.
у меня была нужда реализовать коллекции большой длины (в среднем
коллекция длиной 20, но блин *редкие* долетают до миллиона) и я
выделил спейс на хранение коллекций
name(text), internal_id(num64), value
праймари ключ у меня name:internal_id
далее можно посмотреть на хвост коллекции нечто вроде:
function last(name)
return
box.space[space].index[0]:max(name)
end
и на голову:
function first(name)
return
box.space[space].index[0]:min(name)
end
и далее сделать push:
function push(name, value)
local l = last(name)
local no = tonumber64(0)
if l ~= nil then
no = box.unpack('l', l[1]) + tonumber64(1)
end
return box.insert(space, name, box.pack('l', no), value)
end
и это будет коллекция неуникальных значений. к ней можно дописать
методы pop, shift, unshift (что у меня и сделано)
если мы хотим коллекцию уникальных значений то делаем праймари ключ:
name, value
и второй ключ
name, internal_id
тапл: name, internal_id, value
по второму ключу можно восстановить порядок с которым помещены записи
(взять последнюю/первую). Праймари ключ адресует запись
function first(name)
return
box.space[space].index[1]:min(name)
end
function last(name)
return
box.space[space].index[1]:max(name)
end
function push(name, value)
local t = box.select(space, 0, name, value)
local no = tonumber64(0)
if t == nil then
local l = last(name)
if l ~= nil then
no = box.unpack('l', l[1]) + tonumber64(1)
end
end
return box.insert(space, name, box.pack('l', no), value)
end
как-то так.
у меня в неуникальной коллекции было еще необходимость удалять
элементы по значению - было два индекса:
name:id (праймари), name:value (неуникальный)
ну а в коллекции уникальных
name:value (праймари), name:id (уникальный)
получается два спейса на все случаи жизни.
но в целом для лайков вероятно это подойдет если вы вытеснять лайки
собираетесь очень редко и поэтому будут накапливаться большие
значения.
кстати функция like() из предыдущего примера могла контроллировать
размер и вытеснять по достижении скажем 100-200 лайков в тапле. и не
городить огород с коллекциями в спейсах.
> - Почему мир ушел от подобного подхода , и куда если не секрет)
> а так пока для меня наверное самый рабочий вариант, правда уже lua на редис
> пописал, но лучше в 1 запрос все проблемы решать.
мир никуда не ушел, все хайлоады только на этом подходе и вертятся :)