仍然使用 Jaeger/Sentry?Uptrace 是一个用于 OpenTelemetry 的 开源 APM,您可以使用它来监控应用程序并设置警报以通过电子邮件、Slack、Telegram 等方式接收通知。

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 (小数部分被丢弃)
stringstring
falseredis.Nil 错误
trueint64(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 Overview

Uptrace 带有直观的查询构建器、丰富的仪表板、带有通知的警报规则,以及大多数语言和框架的集成。

Uptrace 可以在一台服务器上处理数十亿个跨度和指标,并允许您以低 10 倍的成本监控您的应用程序。

您只需几分钟即可通过访问 云演示在新窗口中打开(无需登录)或使用 Docker在新窗口中打开 在本地运行来试用 Uptrace。源代码可在 GitHub在新窗口中打开 获取。

另请参阅

以下指南可以帮助您开始在 Redis 中使用 Lua 脚本