Пара слов про tarantool

· На чтение уйдёт 2 минуты · (316 слов)

Всё-таки добрались мои загребущие ручонки до tarantool. Я давно на него поглядывал, но честно говоря, особо так и не понимал, чем он лучше. На презентации, в общем-то, пришла в голову мысль попробовать сделать реализацию нашего leaderboard на tarantool. 

Вооружившись скудной документацией (редис в этом плане всё-таки рулит), справочником по Lua (типа такого), и вот этой статьёй (которая больше навредила, чем помогла), я устремился в бой. На try.tarantool.org.

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

А вообще, через полчасика курения мануалов, это всё уже не кажется таким чужим и уродским, хотя и симпатичным всё ещё не кажется. Тем не менее, я уже выучил команды для создания спэйса ("таблицы") и индексов в ней. И даже программно её заполнил, написав правильный цикл :-).

На этой оптимистичной, но не финальной ноте, всё-таки отправлюсь поспать. Пока получилось примерно вот что:

tarantool> s = box.schema.create_space('scores')
---
...
 
tarantool> s:create_index('primary', {type='tree', unique=true, parts={1, 'num'}})
---
...
 
tarantool> for i = 1, 100, 1 do s:insert({i, i, 100-i}); end
---
...
 
tarantool> s:create_index('wins', {type='tree', unique=false, parts={2, 'num'}})
---
...
 
tarantool> s:create_index('loses', {type='tree', unique=false, parts={3, 'num'}})
---
...

Ожидаемый результат - хранимая процедура на lua, которая по userId выдаст лидерборд по проигрышам в формате:
1 место - {1, 1, 99}
2 место - {2, 2, 98}
49 место - {49, 49, 51}
50 место - {50, 50, 50}
51 место - {51, 51, 51}
100 место - {100, 100, 0}

То есть именно вот эти вот 6 кортежей. В принципе, как посчитать соседей в одну сторону, я уже нашёл. В принципе, понятно и как добавить лидеров и особенно замыкающих. Не очень понятно лишь, как сформировать "серединку", неужто сначала итерируя по индексу назад, а затем вперёд?..

Утро вечера мудренее, завтра буду разбираться :-)

Полезное