调试(Debug)Redis的Lua脚本

由于Redis命令方式运算能力比较薄弱,所以往往采用Redis Lua去代替它原有的命令方式。Redis Lua在Redis的执行中是具备原子性的,当它被执行时不会被其他客户端发送过来的命令打断,通过这样一种机制可以在需要高并发的环境下考虑使用Redis去代替数据库。如果只是单纯的使用脚本其实不能debug也不所谓,直接print也能解决大部分问题了,但Lua作为嵌入式语言,一旦被集成到其他环境中调试起来就比较麻烦了。这里我也是摸索了一会才用起来,记录下。
redislua.jpg

一开始用的Windows的Redis,看视频里演示的也是Win10,但是我测试的时候只要debug就会卡住,能关,但是不能输入命令和操作,而且不debug就没问题。无奈,遂换到树莓派上的Redis。测试了下debug成功了,记录下过程。
首先Redis的Lua脚本是可以在命令行debug的,但是本着方便实用的原则,还是找了个IDE,就ZeroBrane了。
安装好了之后添加Redis插件,下载地址:https://github.com/pkulchenko/ZeroBranePackage/blob/master/redis.lua
将其放到package路径下:
zerobraneredisplugin.png

然后启动ZeroBrane,选择Lua Interceptor为Redis,这样执行的Lua脚本就会被发送到Redis服务器,每当打开IDE后第一次执行时,这个插件就会提示输入Server地址,然后就会一直使用这个地址。如果要更换地址貌似只能重启。
Snipaste_2019-06-03_20-08-44.png

配置好了服务器就已经可以跑了,不过脚本一般都会带几个参数,我们需要把参数传递给脚本。这里先给出一个脚本作示例:

-- 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...会弹出一个对话框,输入参数即可,需要注意下参数输入的格式。上文脚本的参数如下图:
scriptparam.png

脚本分三部分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单步。如图:
debug.png

可以查看变量值,那就到这里吧,可以自己看原文再研究研究。

标签: none

仅有一条评论

  1. 奥术大师大所 奥术大师大所

    ali-04.gif ali-04.gif ali-04.gif ali-04.gif ali-04.gif ali-04.gif ali-04.gif ali-04.gif ali-04.gif ali-04.gif ali-04.gif ali-04.gif ali-04.gif

添加新评论

ali-01.gifali-58.gifali-09.gifali-23.gifali-04.gifali-46.gifali-57.gifali-22.gifali-38.gifali-13.gifali-10.gifali-34.gifali-06.gifali-37.gifali-42.gifali-35.gifali-12.gifali-30.gifali-16.gifali-54.gifali-55.gifali-59.gif

加载中……