Go Redis Lua 脚本
redis.Script
go-redis 支持使用 redis.Script 进行 Lua 脚本编程,例如,以下脚本使用 `GET` 和 `SET` 命令在 Lua 中实现 `INCRBY` 命令
var incrBy = redis.NewScript(`
local key = KEYS[1]
local change = ARGV[1]
local value = redis.call("GET", key)
if not value then
value = 0
end
value = value + change
redis.call("SET", key, value)
return value
`)
然后您可以像这样运行脚本
keys := []string{"my_counter"}
values := []interface{}{+1}
num, err := incrBy.Run(ctx, rdb, keys, values...).Int()
在内部,go-redis 使用 EVALSHA 来执行脚本,如果脚本不存在,则回退到 EVAL。
您可以在 GitHub 找到上面的示例。有关更现实的示例,请查看 redis_rate,它实现了一个 漏桶速率限制器。
Lua 和 Go 类型
在底层,Lua 的 `number` 类型是一个 `float64` 数字,用于存储整数和浮点数。由于 Lua 不区分整数和浮点数,因此 Redis 始终将 Lua 数字转换为整数,并丢弃小数部分,例如,`3.14` 变成 `3`。如果您想返回浮点值,请将其作为字符串返回,然后使用 Go 中的 Float64 助手解析字符串。
Lua 返回 | Go interface{} |
---|---|
number (float64) | int64 (小数部分被丢弃) |
string | string |
false | redis.Nil 错误 |
true | int64(1) |
{ok = "status"} | string("status") |
{err = "error message"} | errors.New("error message") |
{"foo", "bar"} | []interface{}{"foo", "bar"} |
{foo = "bar", bar = "baz"} | []interface{}{} (不支持) |
调试 Lua 脚本
调试 Lua 脚本最简单的方法是使用 `redis.log` 函数,该函数将消息写入 Redis 日志文件或 `redis-server` 输出
redis.log(redis.LOG_NOTICE, "key", key, "change", change)
如果您更喜欢调试器,请查看 Redis Lua 脚本调试器。
传递多个值
您可以在 Lua 中使用 `for` 循环来迭代传递的值,例如,对数字求和
local key = KEYS[1]
local sum = redis.call("GET", key)
if not sum then
sum = 0
end
local num_arg = #ARGV
for i = 1, num_arg do
sum = sum + ARGV[i]
end
redis.call("SET", key, sum)
return sum
结果
sum, err := sum.Run(ctx, rdb, []string{"my_sum"}, 1, 2, 3).Int()
fmt.Println(sum, err)
// Output: 6 nil
循环继续
Lua 不支持循环中的 `continue` 语句,但您可以使用嵌套的 `repeat` 循环和 `break` 语句来模拟它
local num_arg = #ARGV
for i = 1, num_arg do
repeat
if true then
do break end -- continue
end
until true
end
错误处理
默认情况下,`redis.call` 函数会引发 Lua 错误并停止程序执行。如果您想处理错误,请使用 `redis.pcall` 函数,它会返回一个带有 `err` 字段的 Lua 表
local result = redis.pcall("rename", "foo", "bar")
if type(result) == 'table' and result.err then
redis.log(redis.LOG_NOTICE, "rename failed", result.err)
end
要返回自定义错误,请使用 Lua 表
return {err = "error message goes here"}
监控性能
监控 Redis 数据库的性能对于维护系统整体健康、效率和可靠性至关重要。适当的性能监控有助于在导致服务中断或性能下降之前识别和解决潜在问题。
Uptrace 是一个支持分布式跟踪、指标和日志的 DataDog 竞争对手,您可以使用它来监控应用程序并排查问题。
Uptrace 带有直观的查询构建器、丰富的仪表板、带有通知的警报规则,以及大多数语言和框架的集成。
Uptrace 可以在一台服务器上处理数十亿个跨度和指标,并允许您以低 10 倍的成本监控您的应用程序。
您只需几分钟即可通过访问 云演示(无需登录)或使用 Docker 在本地运行来试用 Uptrace。源代码可在 GitHub 获取。
另请参阅
以下指南可以帮助您开始在 Redis 中使用 Lua 脚本