如何确定在Redis中执行Lua脚本的执行时间?
我有一个小 Lua 脚本要在 Redis 中运行,我想知道它的执行时间。由于 Redis 及其 Lua 实现的性质,我不能在脚本的起始点/返回点使用 TIME 函数,并在返回中包含此信息以供处理 (参见 http://redis.io/commands/eval - Scripts as pure functions)。这会导致错误:(error) ERR Error running script (call to f_a49ed2fea72f1f529843d6024d1515e76e69bcbd): Write commands not allowed after non deterministic commands。我搜索了一些我可以调用的函数/调用,可以返回上次运行脚本的执行时间,但目前还没有找到任何东西。我正在使用 PHP 和 Predis 库。虽然我可以从 PHP 端检查执行时间,但我希望消除传输开销并找出 Lua 脚本将阻止对数据库的访问多长时间。如果我不需要更改在 Redis 中存储的数据,我已成功返回了时间,而这些时间约为 PHP 报告的时间的 1/10。如何确定 Redis 中 Lua 脚本的执行时间,而不是通过 PHP?
如果在构建 Redis 时启用了 os 模块,则可以在脚本中使用 os.clock()。
在 https://github.com/antirez/redis/blob/unstable/src/scripting.c 的第 484 行将 #if 0 更改为 #if 1:
void luaLoadLibraries(lua_State *lua) {
luaLoadLib(lua, "", luaopen_base);
luaLoadLib(lua, LUA_TABLIBNAME, luaopen_table);
luaLoadLib(lua, LUA_STRLIBNAME, luaopen_string);
luaLoadLib(lua, LUA_MATHLIBNAME, luaopen_math);
luaLoadLib(lua, LUA_DBLIBNAME, luaopen_debug);
luaLoadLib(lua, "cjson", luaopen_cjson);
luaLoadLib(lua, "struct", luaopen_struct);
luaLoadLib(lua, "cmsgpack", luaopen_cmsgpack);
#if 1 /* Stuff that we don't load currently, for sandboxing concerns. */
luaLoadLib(lua, LUA_LOADLIBNAME, luaopen_package);
luaLoadLib(lua, LUA_OSLIBNAME, luaopen_os);
#endif
}
编辑:rld 已过时。
您可以使用 rld(https://github.com/RedisLabs/redis-lua-debugger)并将其打印到日志中-日志具有时间信息(尽管自然地,rld会使您的脚本运行更慢)。
从Redis v3.2开始,您可以选择通过调用新的redis.replicate_commands()API来复制命令而不是脚本。这将允许您在执行写操作的脚本中调用TIME,而不触发不确定性错误,等等。
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
你可以通过将 slowlog-log-slower-than 参数更改为 0 来激活 Redis 慢日志功能。它将记录所有命令的执行时间(包括 Lua 脚本和任何执行时间)。
慢日志保存在内存队列中,您必须定期转储才能收集数据。根据流量的大小,您可能需要增加 slowlog-max-len 以确保捕获您感兴趣的执行时间。
您可以使用 slowlog get 命令 来转储慢日志。由您来过滤掉不需要的结果。据我所知,在数据收集时没有过滤 Lua 统计信息的可能性。