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

Redis:获取/扫描/遍历所有键

遍历键

不建议使用 KEYS prefix:* 命令来获取 Redis 实例中的所有键,尤其是在生产环境中,因为这可能是一个缓慢且资源密集的操作,会影响 Redis 实例的性能。

相反,您可以使用 SCAN在新窗口中打开 命令迭代匹配某些模式的 Redis 键。

var cursor uint64
for {
	var keys []string
	var err error
	keys, cursor, err = rdb.Scan(ctx, cursor, "prefix:*", 0).Result()
	if err != nil {
		panic(err)
	}

	for _, key := range keys {
		fmt.Println("key", key)
	}

	if cursor == 0 { // no more keys
		break
	}
}

go-redis 允许简化上面的代码为

iter := rdb.Scan(ctx, 0, "prefix:*", 0).Iterator()
for iter.Next(ctx) {
	fmt.Println("keys", iter.Val())
}
if err := iter.Err(); err != nil {
	panic(err)
}

集合和哈希

您也可以遍历集合元素

iter := rdb.SScan(ctx, "set-key", 0, "prefix:*", 0).Iterator()

以及哈希

iter := rdb.HScan(ctx, "hash-key", 0, "prefix:*", 0).Iterator()
iter := rdb.ZScan(ctx, "sorted-hash-key", 0, "prefix:*", 0).Iterator()

集群和环

如果您使用的是 Redis 集群Redis 环,则需要分别扫描每个集群节点。

err := rdb.ForEachMaster(ctx, func(ctx context.Context, rdb *redis.Client) error {
	iter := rdb.Scan(ctx, 0, "prefix:*", 0).Iterator()

	...

	return iter.Err()
})
if err != nil {
	panic(err)
}

删除没有 TTL 的键

您也可以使用 SCAN 删除没有 TTL 的键。

iter := rdb.Scan(ctx, 0, "", 0).Iterator()

for iter.Next(ctx) {
	key := iter.Val()

    d, err := rdb.TTL(ctx, key).Result()
    if err != nil {
        panic(err)
    }

    if d == -1 { // -1 means no TTL
        if err := rdb.Del(ctx, key).Err(); err != nil {
            panic(err)
        }
    }
}

if err := iter.Err(); err != nil {
	panic(err)
}

有关使用管道的更高效版本,请查看 示例在新窗口中打开

监控性能

监控 Redis 数据库的性能对于维护系统的整体健康状况、效率和可靠性至关重要。正确的性能监控有助于在潜在问题导致服务中断或性能下降之前识别和解决这些问题。

Uptrace 是一个 OpenTelemetry 后端在新窗口中打开,支持分布式跟踪、指标和日志。您可以用它来监控应用程序并排查问题。

Uptrace Overview

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

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

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