就在圣诞节前,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
) 在以调试模式运行脚本时提供相应的控制台。您可以在 文档页面 上或在此简短的 视频介绍 (33:40m) 中了解更多信息,该视频由 Salvatore Sanfilippo 制作。
在 Redis 中执行嵌入式 Lua 脚本的能力是人类历史上最棒的功能之一,也是 Redis 的 top-k 之一。该语言的简单语法、方便的数据结构和基础库使您能够轻松地在数据管理的位置对其执行复杂的操作。除了以任何可想象的方式扩展 Redis 之外,您通常还能节省延迟和带宽。对我来说,新的 Lua 调试器是一个梦想成真——我一直着迷于 Redis 的脚本,但也同样沮丧于无法对其进行调试。
我是一个超级开发者,很少写出错误,可能每行代码中只有三四个错误……为了找出这些错误,我尝试了 不同的跟踪方法,甚至写了一个 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 良好地协作。查看 the screencast (10:26) 以获取介绍,或按照以下步骤进入 Lua 调试的天堂。
packages
目录(例如 /opt/zbstudio/packages/
)中,或者将其放到您的 ~/.zbstudio/packages
目录中,以便独自享受它。就是这样——启动 ZBS,您就可以开始使用了!它与任何 IDE 一样直观,但 ZBS 还提供了 教程 和充足的 文档,如果您需要额外的资源。
为了让您快速了解 ZBS 和 Redis 的使用方法,以下是一些快速提示… 一旦 IDE 加载(速度非常快 BTW),您将需要从默认的 Lua 解释器切换到 Redis——您可以从 **项目->Lua 解释器** 菜单中进行操作,或者单击窗口的右下角并从弹出菜单中选择它。
选择 Redis 解释器后,您执行或调试的 Lua 脚本将被发送到 Redis 服务器。每次启动新的 IDE 会话时,该插件都会提示您输入服务器的 URI,并将其存储以供下次会话使用(出于安全考虑,密码不会保存)。即使您没有提供密码并连接到受密码保护的 Redis 服务器,该插件也会提示您输入密码。
通过 **项目->命令行参数** 对话框指定脚本的
KEYS
和 ARGS
。在其中,使用 redis-cli --eval
所期望的语法:a) 以空格分隔的键名称列表,后面跟着 b) 一个空格、一个逗号 (‘,’) 和另一个空格,再后面跟着 c) 一个以空格分隔的参数列表。此示例演示了如何传递两个键名称(foo 和 bar)和一个参数 (42) 到脚本…
编辑器很简单,但在语法高亮、有用的工具提示和对包括 Redis Lua API 在内的所有内容的自动完成功能的基础上,还提供了许多功能。您可以进行正则表达式搜索,重命名变量,跳转到定义,注释/折叠/缩进代码,以及我最喜欢的功能:使用 Shift-Alt-箭头同时编辑多行。
真正的魔力发生在您点击那个小绿三角并开始调试时。您可以逐步执行脚本,切换断点,定义监视,查看堆栈跟踪——所有内容都按预期工作(我认为这就是它如此酷的原因)。
但在您自己尝试所有这些功能之前(您真的应该尝试!),您需要了解的最后一个功能是 **远程控制台**。在调试会话中,远程控制台允许您输入由 Redis 服务器评估的 Lua 语句。您还可以使用脚本的变量,但由于语句是在不同的框架中执行的,因此您无法修改变量本身。
更方便的是,可以通过在命令前加一个 ‘@’ 或将其全部 **大写** 来在远程控制台中调用任何 Redis API 命令(允许从脚本中调用)。这使您可以在脚本执行期间更改数据库的内容(但请记住,更改将被丢弃或保留,具体取决于 LDB 的模式)。
完全支持 Redis Lua API 和库(例如 cjson 和 cmsgpack),包括新的调试器命令,因此您可以调用 redis.debug
将消息打印到输出控制台,并使用 redis.breakpoint
触发条件断点。快速跳转到控制台中的错误行并双击以跳转到该行,以及无限循环检测功能也包含在内。该插件的配置记录在该插件文件末尾。
需要注意的几个其他要点
trace
命令不会输出这些变量。由于这仅仅是插件的初始版本,您可以在未来期待改进。为此,我们依赖您的反馈 - 可以直接在仓库中打开 问题 和 拉取请求,对于其他一切,始终可以通过 Twitter 和 电子邮件 联系我们。