调试 Redis lua脚本

岳景明
2023-12-01

前言

如果想用Redis实现一些进阶功能的话,lua脚本可能是一个绕不开的话题。

Redis从2.6开始加入了对Lua脚本的支持,可以说Lua脚本的加入极大的拓展了Redis功能。使用Lua脚本至少有以下两个好处:

  1. 将复杂的Redis存取逻辑与业务代码独立开
  2. 更好的事务性能

Redis从3.2版本开始提供了一个完整的lua脚本调试器。本文将介绍如何使用redis-cli运行lua脚本。

允许远程连接Redis

如果本机安装了redis可以直接访问127.0.0.1连接,如果要连接远程Redis则需要确保Redis允许其它IP访问。

  1. 首先找到redis.conf文件,一般是在/etc文件夹下

  2. 找到bind 127.0.0.1这一行,改成0.0.0.0

  3. 指定配置文件重启redis服务redis-server /etc/redis.conf

redis-cli运行lua脚本命令

redis-cli -h {redis_host} -p {redis_port} -a {redis_password} -n {database} --ldb eval /path/to/script keys [key1 key2 key3…] , args [argv1 argv2 argv3…]

参数说明必需示例
redis_host需要连接的redis ip127.0.0.1
redis_port需要连接的redis端口6379
redis_passwordredis密码123456
database需要操作的redis db10
因为Redis版本不同,命令可能会有些不同
`redis-cli -h {redis_host} -p {redis_port} -a {redis_password} -n {database} --ldb --eval  /path/to/script keys [key1 key2 key3…] , args [argv1 argv2 argv3…]`

其中key 与argv之间用,分开,注意,两边都要加空格。

示例

先准备一个示例lua脚本:

-- 接收2个Key
local key1 = KEYS[1]
local key2 = KEYS[2]

-- 接收2个参数
local v1 = ARGV[1]
local v2 = ARGV[2]

-- 操作数据
redis.call('hincrby', key1, v1, 1)
redis.call('hincrby', key2, v2, -1)

运行命令

redis-cli -h 127.0.0.1 -p 6379 -a 123456 -n 1 --ldb --eval demo.lua h:t:1 h:t:2 , f1 f2

我们会进入到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 key1 = KEYS[1]
lua debugger> n
* Stopped at 2, stop reason = step over
-> 2   local key2 = KEYS[2]
lua debugger> n
* Stopped at 4, stop reason = step over
-> 4   local v1 = ARGV[1]
lua debugger> n
* Stopped at 5, stop reason = step over
-> 5   local v2 = ARGV[2]
lua debugger> n
* Stopped at 7, stop reason = step over
-> 7   redis.call('hincrby', key1, v1, 1)
lua debugger> n
<redis> hincrby h:t:1 f1 1
<reply> 1
* Stopped at 8, stop reason = step over
-> 8   redis.call('hincrby', key2, v2, -1)
lua debugger> print v1
<value> "f1"
lua debugger> n
<redis> hincrby h:t:2 f2 -1
<reply> -1
* Stopped at 10, stop reason = step over
-> 10  <out of range source code line>
lua debugger> n

(nil)

(Lua debugging session ended -- dataset changes rolled back)

使用n可以运行当前语句,使用print打印变量值。

总结

本文介绍了如何使用redis-cli调试lua脚本及基础操作,囿于篇幅,redis的lua脚本调试器还有一些实用的指令未能在本文介绍。

 类似资料: