Highly Likely
Так тоже можно
Highly Likely
Если redis.call возвращает два значения
Vlad
Нет, table
Highly Likely
А какого вида table? :)
Highly Likely
Вообще, лучше сделать нечто вроде
Serezha
Vlad
table вида {1, 2}, я так понимаю =)
Vlad
Highly Likely
local res = redis.call(…)
local score, number = res.score, res.number
Highly Likely
Serezha
Руби!
В луа и го красиво можно :)
Vlad
redis> ZPOPMIN myzset
1) "1"
2) "one"
Vlad
Два стринга подряд
Highly Likely
Highly Likely
Что твоя обертка делает с ними неясно :)
Highly Likely
print(type(redis.call(…))
Highly Likely
Вот покажи, что выведет
Highly Likely
Только внутрь вызова свои аргументы укажи
Vlad
Эх, если бы это было так просто. Нужно залезать в Редис дебаг
Highly Likely
Vlad
local res = redis.call("ZPOPMIN", key)
local score, member = res[0], res[1]
Так сделал, работает, вроде
Highly Likely
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.
Vlad
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
Полезно, не знал, что можно кэшировать ссылки на функции
Pavel
Pavel
Ну смысл скорее в вызове функции из глобала при большом стеке вызовов.
Snusmumriken
Да, именно так.
Но не только из глобала, иногда тупо полезно закешировать что-то что пусть и находится близко, но вызывается часто. И сократишь ссылку и сократишь поиск.
Pavel
Любопытно. Спасибо. Почему то думал что лукап сверх дешёвый
Snusmumriken
Он-то дешёвый. Но вопрос частоты и количества вызовов. Если злоупотреблять, на этот лукап может уходить 20-70% процессорного времени внутри цикла (особенно если в цикле не делается ничего сложного, а лукап длинный, тогда процентный прирост плюшек от кеша выше).
Snusmumriken
Типа знаешь, помахать кому-то рукой — просто. Но если тебе надо поприветствовать десять тысяч человек, помахав каждому рукой а потом закрепив рукопожатием, ты предпочтёшь не махать рукой, ибо экономит время раза в два ))
Snusmumriken
Во, типо бенчмарк ))
Слегка притянуто за уши, но тем не менее.
Alex
А почему socket время замеряет а не os.clock() ?
Alex
Во, типо бенчмарк ))
Слегка притянуто за уши, но тем не менее.
Vlad
Serezha
Зачем вообще использовать стандартный луа да еще на вин платформе?
Serezha
Если перенести тест в реальную среду типа луаджит в опенрести результат может быть совсем другим
Vlad
Если вопрос адресован мне, то я использую Lua в Redis-сервере
Vlad
А, не мне. Это про бенчи. Ну ладно
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
Lucky
Я, это, погуглил.
Maxim
Я, это, погуглил.
Даже не представлял что гуглить, но теперь, благодаря вам обладаю этими знаниями, прикрутил сервис обработки изображений налету и нужно добавить пару новых фишек типа водный знак и рамки вокруг картинки, а с libvips знаком поверхностно
Lucky
гуглил «libvips lua picture compose» в разных сочетаниях
Lucky
добавлял произвольно documentation examples samples
Lucky
Maxim
Yuriy
всем привет. Кто подсткажет какую нить хорошую обертку для dns резолвера?
Yuriy
в продолжение ^^
никто не в курсе
socket.dns.toip(address)
Гоняет за адресом напрямую в ближайший dns указанный в системе или использует внутренний cache