使用lua调用redis redis lua调试_lua脚本编辑器


之前用redis setnx实现分布式锁的时候遇到一些问题,例如不是原子性等问题,看网上博客文章都是建议去用lua脚本去保证原子性。

由于没接触过lua脚本,就去菜鸟教程看了相关语法理解了意思。写了以下代码。


import


相比 一开始写的代码,有几处改动。

1、将一开始设置加锁成功的代码块里,做的rediskey超时设置去掉了,因为没保证加锁的同时设置超时时间,如果加锁成功后线程挂掉,锁没有超时时间,导致无法释放锁。

2、将作为锁的rediskey的值设置为随机数或者跟随时间戳变化的数,这样做的目的是保证解锁的线程与加锁的线程一致。

总结起来就是一个可靠的分布式锁需要具备以下四个特征:

互斥性。在任意时刻,只有一个客户端能持有锁。
不会发生死锁。即使有一个客户端在持有锁的期间崩溃而没有主动解锁,也能保证后续其他客户端能加锁。
具有容错性。只要大部分的Redis节点正常运行,客户端就可以加锁和解锁。
解铃还须系铃人。加锁和解锁必须是同一个客户端,客户端自己不能把别人加的锁给解了。

回到代码上的lua脚本。我写了两行代码,一行加锁的


if


一行解锁的


if


一开始我只是止步于这行代码能运行成功就行,毕竟网上可以copy,但是网上文章繁多,代码参差不齐,也不乏一些错误代码。于是我不太相信,本着程序员对未知代码就想debug的原则,我查阅了网上关于lua脚本的编辑器能否做debug用。

果然找到了专门的lua编辑器zbstudio ,我已经上传到网盘,大家自取。

链接:https://pan.baidu.com/s/1A29q8qqQ-VFJA8RBjGNFgw

提取码:9nkt

其中的exe文件是安装包,直接双击执行即可。在运行后,将redis.lua文件放入安装目录下的packages目录下然后重新打开zbstudio即可。

然后打开后就可以看到如下的界面。


使用lua调用redis redis lua调试_lua脚本编辑器_02


点击红色圈住的Redis进行设置。

接着我们运行一下上面的加锁代码。


使用lua调用redis redis lua调试_redis_03


把代码中的KEYS[1],ARGV[1],EXPIRE替换为你在业务代码里的常量,快去试试吧。

其中KEYS[1]是redis的key,ARGV[1]为value,EXPIRE为key的失效时间(毫秒单位)

调试过程中的信息如果出现

“ Detected Redis server v3, but need v3.2+ for the debugging to work.
Unknown SCRIPT subcommand or wrong # of args. ”

表明redis 版本该升级了。低版本还不支持debug。不过运行是正常的。

之前在公司看到同事有用命令行去连接redis的,感觉操作不方便,网上找到一个不错的redis客户端,

下载地址:

qishibo/AnotherRedisDesktopManagergithub.com


截个图,界面上直观显示了redis server的很多信息以及键值对信息。


使用lua调用redis redis lua调试_客户端_04