Redis Lua 远程调试

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

往上