Highly Likely
Так тоже можно
Highly Likely
Если redis.call возвращает два значения
Vlad
Нет, table
Highly Likely
А какого вида table? :)
Highly Likely
Вообще, лучше сделать нечто вроде
Vlad
table вида {1, 2}, я так понимаю =)
Highly Likely
local res = redis.call(…) local score, number = res.score, res.number
Serezha
Руби!
В луа и го красиво можно :)
Vlad
redis> ZPOPMIN myzset 1) "1" 2) "one"
Vlad
Два стринга подряд
Highly Likely
redis> ZPOPMIN myzset 1) "1" 2) "one"
Это редис возвращает
Highly Likely
Что твоя обертка делает с ними неясно :)
Highly Likely
print(type(redis.call(…))
Highly Likely
Вот покажи, что выведет
Highly Likely
Только внутрь вызова свои аргументы укажи
Vlad
Эх, если бы это было так просто. Нужно залезать в Редис дебаг
Vlad
local res = redis.call("ZPOPMIN", key) local score, member = res[0], res[1] Так сделал, работает, вроде
Highly Likely
Шо такое – гугли :)
Snusmumriken
Есть такая замечательная библиотека, называется inspect (https://github.com/kikito/inspect.lua) Всё что тебе непонятно — запихиваешь в неё. Ну например local res = {redis.call(…)} print(inspect(res)) Что тут происходит? 1. Мы записываем в res все-все возвращаемые значения redis.call. Они сохраняются массивом. И таблички туда, и циферки, и стринги всякие. Всё что вернётся — будет в этой массиво-табличке. 2. Мы "инспектируем" эту табличку, выводя её содержимое куда-нибудь (можешь ещё в файл записать). 3. На основе полученных данных, делаем соответствующие выводы.
Vlad
Большое спасибо!
Vlad
К сожалению, дебаг скриптов в Редисе — весьма обширная тема (ссылки не разрешаете, redis .io/topics/ldb)
Vlad
И inspect там нет
Snusmumriken
Большое спасибо!
То есть, если там вдруг у тебя redis.call возвращает другую массиво-табличку, то ты её можешь распаковать через unpack (как сказал куб), типа local a, b = unpack({1, 2}) — a и b вполне присвоятся значения 1 и 2.
Snusmumriken
И inspect там нет
А ты это, воспользуйся require?
Vlad
У Редис-сервера ограниченный набор инклудов
Snusmumriken
Там чо, отрубили реквайр? Ну тогда скопипасть содержимое inspect.lua в свой скрипт (без последней строчки с ретурном).
Snusmumriken
Кста-ати, а зачем тебе вызов процедур в редиске?
Vlad
Действительно
Vlad
Спасибо за помощь, в дальнейшем попробую использовать голый inspect
Snusmumriken
Осторожно, пока ты нубас и в чате меньше суток — разрывай ссылки, а то робот думает что ты спамбот.
Vlad
Snusmumriken
Проверь работоспособность dofile, этим тоже можно реквайрить скрипты (с абсолютным путём до них). А если не получится — заменяешь require("modulename") на исходный код этого "modulename".
Maxim
Коллеги, кто нибудь использует или может сталкивался с вот таким сервисом ? https://github.com/weserv/images
Snusmumriken
Привет @Deadpool_Bro, пару слов о себе!
Vlad
Есть смысл с точки зрения оптимизации объявлять переменные вне цикла? local member, score = nil, nil for i, key in ipairs(KEYS) do member, score = unpack(redis.call("ZREVRANGEBYSCORE", key)) end
Vlad
Луа — динамический язык, поэтому я не уверен...
Snusmumriken
В таком случае — нет особого смысла, локальные переменные генерируются/стираются с нормальной скоростью в кеше ЦП. А вот если ты используешь unpack внутри сильно вложенной фигни, и пробегаешь по огромному списку KEYS — то имеет смысл его закешировать. do do do local unpack = unpack local call = redis.call for i, key in ipairs(KEYS) do local member, score = unpack(call("...")) end end end end
Vlad
Благодарю
Snusmumriken
Это потому что каждый раз когда ты ищешь переменную в глобал-спейсе, ванильная луа обыскивает каждый локал-спейс по ходу до глобала, в поисках этой переменной. А так ты кешируешь, и оно почти сразу получает ссылку на то что ему нужно.
Snusmumriken
Luajit'у на это почти пофигу, он компилит большие циклы и сокращает моменты поиска сразу до выдачи ссылки до переменной.
Vlad
Полезно, не знал, что можно кэшировать ссылки на функции
Snusmumriken
А почему это касается именно unpack?
Не только, в данном контексте ещё redis.call : ) Ибо тоже вызываемая фигня, которую луям придётся искать.
Pavel
Ну смысл скорее в вызове функции из глобала при большом стеке вызовов.
Snusmumriken
Да, именно так. Но не только из глобала, иногда тупо полезно закешировать что-то что пусть и находится близко, но вызывается часто. И сократишь ссылку и сократишь поиск.
Pavel
Любопытно. Спасибо. Почему то думал что лукап сверх дешёвый
Snusmumriken
Он-то дешёвый. Но вопрос частоты и количества вызовов. Если злоупотреблять, на этот лукап может уходить 20-70% процессорного времени внутри цикла (особенно если в цикле не делается ничего сложного, а лукап длинный, тогда процентный прирост плюшек от кеша выше).
Snusmumriken
Типа знаешь, помахать кому-то рукой — просто. Но если тебе надо поприветствовать десять тысяч человек, помахав каждому рукой а потом закрепив рукопожатием, ты предпочтёшь не махать рукой, ибо экономит время раза в два ))
Snusmumriken
Во, типо бенчмарк )) Слегка притянуто за уши, но тем не менее.
Alex
А почему socket время замеряет а не os.clock() ?
Alex
Во, типо бенчмарк )) Слегка притянуто за уши, но тем не менее.
Vlad
Snusmumriken
А почему socket время замеряет а не os.clock() ?
Опа, забыл про это дело. Ну, ещё разрешающая способность повыше.
Serezha
Зачем вообще использовать стандартный луа да еще на вин платформе?
Serezha
Если перенести тест в реальную среду типа луаджит в опенрести результат может быть совсем другим
Vlad
Если вопрос адресован мне, то я использую Lua в Redis-сервере
Vlad
А, не мне. Это про бенчи. Ну ладно
Snusmumriken
Если перенести тест в реальную среду типа луаджит в опенрести результат может быть совсем другим
1. Луаджит не везде. Я сам плотно сижу на луаджите, но у меня на работе, например, обычная 5.1 (под вендой, хех), поэтому все либы пишутся и для того и для того. Луажиту пофигу на кеширование, но хуже оно не сделает. 2. На вин-платформе потому что где хочу там и бенчу, разница незначительная.
Snusmumriken
3. В редис-сервере никакого луаджита нет. 4. Мир не зациклен на луаджите. А "реальные среды" не зациклены на линексах ((
Lucky
Привет, @Vikas4668 ! Ты не бот случайно?
Anonymous
Это все боты, у них ник автоматически генерируется одинаково
Ilya
Надо более интересные ники ботам придумывать.
Maxim
Коллеги, кто нибудь использует lua-vips (libvips) ? Вопрос банальный, может ссылку кините в меня где почитать о том как накладывать картинки друг на друга?
Lucky
https://github.com/libvips/lua-vips/blob/master/example/combine.lua
Lucky
наложение водяного знака
Maxim
https://github.com/libvips/lua-vips/blob/master/example/combine.lua
Благодарю! Очень выручили!
Lucky
Я, это, погуглил.
Maxim
Я, это, погуглил.
Даже не представлял что гуглить, но теперь, благодаря вам обладаю этими знаниями, прикрутил сервис обработки изображений налету и нужно добавить пару новых фишек типа водный знак и рамки вокруг картинки, а с libvips знаком поверхностно
Lucky
гуглил «libvips lua picture compose» в разных сочетаниях
Lucky
добавлял произвольно documentation examples samples
Maxim
👍
static.flating.pro
Yuriy
всем привет. Кто подсткажет какую нить хорошую обертку для dns резолвера?
Yuriy
в продолжение ^^ никто не в курсе socket.dns.toip(address) Гоняет за адресом напрямую в ближайший dns указанный в системе или использует внутренний cache