Redis 在我们业务中非常重要,但是在使用 Lua 脚本时,调试起来非常麻烦,像我们都是用阿里云或者腾讯云提供的云 Redis,没办法在自己的 Win 电脑上使用 RDB 等工具进行调试,下面的调试过程我们会使用到测试云服务器,并在里面安装了 Docker,方便我们快速搭建一个 Redis 服务端和客户端。
首先创建服务端。
1 2 3 4 5 $ docker run -d --name redis -p 6379:6379 redis:7.2.0 $ docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 1f1e1f08dd6a redis:7.2.0 "docker-entrypoint.s…" 50 seconds ago Up 49 seconds 0.0.0.0:6379->6379/tcp, :::6379->6379/tcp redis
尝试下客户端连接,这里 host 我们要使用服务器的内网 IP ,可以使用 ifconfig eth0
查看。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 $ docker run -it --rm -v ~/lua:/lua redis:7.2.0 redis-cli -h 10.0.16.15 -p 6379 -n 0 --no-auth-warning info server # Server redis_version:7.2.0 redis_git_sha1:00000000 redis_git_dirty:0 redis_build_id:7f39debc4ae51812 redis_mode:standalone os:Linux 3.10.0-1160.90.1.el7.x86_64 x86_64 arch_bits:64 monotonic_clock:POSIX clock_gettime multiplexing_api:epoll atomicvar_api:c11-builtin gcc_version:12.2.0 process_id:1 process_supervised:no run_id:ae6654f351852770e0058401cf4051bf426bc68e tcp_port:6379 server_time_usec:1693990619122397 uptime_in_seconds:163 uptime_in_days:0 hz:10 configured_hz:10 lru_clock:16269019 executable:/data/redis-server config_file: io_threads_active:0 listener0:name=tcp,bind=*,bind=-::*,port=6379
创建一个 Demo Lua
~/lua/hongfs.lua
1 2 3 local hongfs = redis.call('ping' )return hongfs
执行下看看效果。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 $ docker run -it --rm -v ~/lua:/lua redis:7.2.0 redis-cli -h 10.0.16.15 -p 6379 -n 0 --no-auth-warning --ldb --eval /lua/hongfs.lua Lua debugging session started, please use: quit -- End the session. restart -- Restart the script in debug mode again. help -- Show Lua script debugging commands. * Stopped at 1, stop reason = step over -> 1 local hongfs = redis.call('ping' ) lua debugger> step <redis> ping <reply> "+PONG" * Stopped at 3, stop reason = step over -> 3 return hongfs lua debugger> step PONG (Lua debugging session ended -- dataset changes rolled back) 10.0.16.15:6379> quit
它会某一个步骤都会停下来,我们可以用 step
或者 next
命令进行下一步,quit
退出调试,restart
重新开始调试,print
打印变量。
更多具体可见: https://redis.io/docs/interact/programmability/lua-debugging/
如果 Lua 脚本有参数,比如 KEYS[1]
,ARGV[1]
,我们可以这样传递(注意 ,
分隔)。
1 $ docker run -it --rm -v ~/lua:/lua redis:7.2.0 redis-cli -h 10.0.16.15 -p 6379 -n 0 --no-auth-warning --ldb --eval /lua/hongfs.lua key1 key2 , arg1 arg2
另外还要注意,redis.call 返回的 nil ,可能你要用 false 去判断,更多可以参考:
https://redis.io/docs/interact/programmability/lua-api/#resp2-to-lua-type-conversion
https://redis.io/docs/interact/programmability/lua-api/#lua-to-resp3-type-conversion