调试(Debug)Redis的Lua脚本
由于Redis命令方式运算能力比较薄弱,所以往往采用Redis Lua去代替它原有的命令方式。Redis Lua在Redis的执行中是具备原子性的,当它被执行时不会被其他客户端发送过来的命令打断,通过这样一种机制可以在需要高并发的环境下考虑使用Redis去代替数据库。如果只是单纯的使用脚本其实不能debug也不所谓,直接print也能解决大部分问题了,但Lua作为嵌入式语言,一旦被集成到其他环境中调试起来就比较麻烦了。这里我也是摸索了一会才用起来,记录下。
- https://redis.io/topics/ldb 命令行调试
- https://redislabs.com/blog/zerobrane-studio-plugin-for-redis-lua-scripts/ 在zerobrane中调试,本文基本翻译自此篇
一开始用的Windows的Redis,看视频里演示的也是Win10,但是我测试的时候只要debug就会卡住,能关,但是不能输入命令和操作,而且不debug就没问题。无奈,遂换到树莓派上的Redis。测试了下debug成功了,记录下过程。
首先Redis的Lua脚本是可以在命令行debug的,但是本着方便实用的原则,还是找了个IDE,就ZeroBrane了。
安装好了之后添加Redis插件,下载地址:https://github.com/pkulchenko/ZeroBranePackage/blob/master/redis.lua
将其放到package路径下:
然后启动ZeroBrane,选择Lua Interceptor为Redis,这样执行的Lua脚本就会被发送到Redis服务器,每当打开IDE后第一次执行时,这个插件就会提示输入Server地址,然后就会一直使用这个地址。如果要更换地址貌似只能重启。
配置好了服务器就已经可以跑了,不过脚本一般都会带几个参数,我们需要把参数传递给脚本。这里先给出一个脚本作示例:
-- purchase.lua
-- 抢购商品脚本
local productSetKEY = KEYS[1]
local productPurchaseListKEY = KEYS[2]
local userId = ARGV[1]
local productId = ARGV[2]
local quantity = tonumber(ARGV[3])
local purchaseDate = ARGV[4]
-- 记录商品编号
redis.call('sadd', productSetKEY, productId)
-- 购买列表
local productPurchaseList = productPurchaseListKEY .. productId
-- 取出库存比较
local productKey = 'product_' .. productId
local stock = tonumber(redis.call('HGET', productKey, "stock"))
if (stock < quantity) then
return 0
else
-- 扣减库存
stock = stock - quantity
redis.call('HSET', productKey, "stock", tostring(stock))
end
-- 本次购买记录
local price = redis.call('HGET', productKey, 'price')
local purchaseRecord = userId .. ',' .. quantity .. ',' .. price .. ',' .. purchaseDate
-- 保存记录
redis.call('RPUSH', productPurchaseList, purchaseRecord)
return 1
这是一个简单的商品抢购脚本,脚本需要一些商品和用户信息,然后从redis中取出商品的库存进行处理。可以不用关心具体的脚本内容,可以看脚本开始就列出了所有需要的参数,两个KEY,4个参数。我们调试的时候需要把脚本测试数据传递给Redis服务器。点击Project -> Command Line Parameters...
会弹出一个对话框,输入参数即可,需要注意下参数输入的格式。上文脚本的参数如下图:
脚本分三部分KEYS、分隔符、ARGV:
- a) 首先是以空格分隔的list是KEYS
- b) 然后是KEYS和ARGV的分隔符为:一个空格接一个逗号再接一个空格
- c) 再是一个空格分隔的list是ARGV
上图中三部分对应的部分分别是:
PRODUCT_SCHEDULE_SET PURCHASE_LIST
,
(有空格的,但是MarkDown编译器好像自动给我去了~~!)1054 2 1 20190603T171023+0800
然后就可以调试了,F5开始,shift + F10单步。如图:
可以查看变量值,那就到这里吧,可以自己看原文再研究研究。
仅有一条评论