就在圣诞节前,Salvatore Sanfilippo 发布了 Redis v3.2 的第一个候选版本。即将发布的 v3.2 提供了新功能(例如地理空间索引和集群重新平衡)和许多重大改进(包括 Matt Stancliff 的快速列表和 Oran Agra 的 SDS 和 Jemalloc 优化)。 在这篇文章中,我将只关注其中的一项——Redis Lua 调试器 (LDB)——并分享来自 Redis 的新年礼物(剧透)。
LDB 是一种执行 Redis Lua 脚本的模式,允许您单步执行 Lua 脚本、设置条件和行断点、检查变量、跟踪堆栈、打印调试输出、评估 Lua 表达式以及运行 Redis 命令。 它具有异步和同步两种子模式,前者是非阻塞的并丢弃对数据集的更新,而后者是阻塞的并保留数据更改。 LDB 在 Redis 服务器中实现,命令行界面 (redis-cli
) 在调试模式下运行脚本时提供相应的控制台。 您可以在文档页面或 Salvatore Sanfilippo 的这段简短的视频介绍 (33:40m) 中了解更多信息。
在 Redis 中执行嵌入式 Lua 脚本的能力是人类历史上最好的功能,也是 Redis 的 top-k 之一。 该语言的简单语法、方便的数据结构和基本库可以轻松地对您管理的数据执行复杂的操作。 除了以任何可以想象的方向扩展 Redis 之外,您通常还可以节省延迟和带宽。 对我来说,新的 Lua 调试器是梦想成真——我一直对 Redis 的脚本着迷,同时也对无法调试它们感到沮丧。
作为超级开发人员,我很少编写错误,也许每 LoC 只有三四个……为了找出这些错误,我尝试了 不同的跟踪方法,甚至求助于编写一个 Redis Lua 调试器 作为 Redis Lua 脚本(该调试器与 v3+ 不兼容,所以遗憾的是,它不再维护)。 但这些永远不够。
在 10 月份的 Redis 开发者日上,我做了一个 简短的会话,本质上是一个 Lua 大杂烩(也是二级索引——参见redimension 和 lua-redimension)。 这绝对不是 Redis 用户第一次要求 Lua 调试器,但我相信我是最后一个提出请求的人……几周后,对调试器的集体愿望得到了满足,因为 LDB 首次亮相不稳定版(我进行了测试,所以如果您发现任何问题,您可以责怪我的粗心大意;))。
一旦 LDB 准备就绪,我就知道必须采取另一步骤,所以我联系了 Paul Kulchenko 并要求他为我们制作一个 ZeroBrane Studio 的 Redis 插件(我也进行了测试,所以再次,任何问题 - 都是我的错)。 ZeroBrane Studio 是 THE Lua IDE。 它是 开源的、轻量级的、跨平台的、可移植的、坚如磐石的、热情维护的,并且涵盖了我 Lua 开发的所有可能需求。 它还拥有一个非常方便的集成调试器,现在,由于 Paul 的工作和 Redis 的赞助,它可以与 Redis 的 LDB 很好地配合使用。 查看 screencast (10:26) 以获取介绍,或按照以下步骤进入 Lua 调试的天堂
packages
目录中(例如 /opt/zbstudio/packages/
),或将其放入您的 ~/.zbstudio/packages
目录中以单独品尝。这就是全部 - 启动 ZBS,您就可以开始了! 它与任何 IDE 一样直观,但 ZBS 也有 教程 和充足的 文档,如果您正在寻找额外的资源。
为了让您快速了解 ZBS 和 Redis 的使用,以下是一些快速提示……一旦 IDE 加载(顺便说一下速度非常快),您就需要从默认的 Lua 解释器切换到 Redis——您可以从 Project->Lua Interpreter 菜单中执行此操作,或者单击窗口的右下角并从弹出菜单中选择它。
选择 Redis 解释器后,您执行或调试的 Lua 脚本将被发送到 Redis 服务器。 每次您启动一个新的 IDE 会话时,插件都会提示您输入服务器的 URI,并将其存储以供下一个会话使用(出于安全目的,不会保存密码)。 即使您不提供密码并连接到受密码保护的 Redis 服务器,插件也会提示您输入密码。
通过 Project->Command Line Parameters 对话框指定脚本的
KEYS
和 ARGS
。 在其中,使用 redis-cli --eval
期望的语法:a) 以空格分隔的键名列表,后跟 b) 一个空格、一个逗号 (',') 和另一个空格,然后是 c) 以空格分隔的参数列表。 此示例显示了如何将脚本传递两个键名(foo 和 bar)和一个参数 (42)...
编辑器很简单,但在语法突出显示、有用的工具提示和自动完成(包括 Redis Lua API 的所有内容)之上提供了很多功能。 您可以进行正则表达式搜索、重命名变量、跳转到定义、注释/折叠/识别代码,以及我个人最喜欢的,使用 Shift-Alt-Arrows 一次编辑多行。
当您点击那个绿色小三角形并开始调试时,真正的魔法就发生了。 您可以单步执行脚本、切换断点、定义监视和查看堆栈跟踪——一切都按照您的预期工作(这就是让它如此酷的原因,IMO)。
但在您自己尝试所有这些之前(您真的应该!),您需要了解的最后一个功能是 远程控制台。 在调试会话中,远程控制台允许您键入由 Redis 服务器评估的 Lua 语句。 您还可以使用脚本的变量,但由于语句在不同的框架中执行,因此您将无法修改变量本身。
更方便的是,可以通过在命令前加上 '@' 或只是大写来在远程控制台中调用任何 Redis API 命令(脚本允许)。 这允许您在脚本执行期间更改数据库的内容(但请记住,更改将被丢弃或保留,具体取决于 LDB 的模式)
支持完整的 Redis Lua API 和库(例如 cjson 和 cmsgpack),包括新的调试器命令。因此,您可以调用 redis.debug
将消息打印到输出控制台,并使用 redis.breakpoint
触发条件断点。它还包括通过双击控制台中的错误快速跳转到有问题的代码行,以及无限循环检测。插件的配置记录在其文件的末尾。
需要注意的几个其他点
trace
命令不输出这些变量。这只是该插件的初始版本,您可以期待未来会有改进。为此,我们依赖您的反馈 – 问题 和 拉取请求 可以直接在存储库中打开,对于其他任何问题,总有 Twitter 和 电子邮件。