You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

valkey-go替代go-redis Scan迭代器的正确实现方案

valkey-go 实现类似go-redis的Scan迭代器批量遍历键

你当前的valkey-go代码只执行了一次SCAN命令,所以只能获取第一批键,无法遍历所有符合条件的键。要实现和go-redis迭代器相同的分批遍历逻辑,需要循环执行SCAN命令,直到游标返回0(表示遍历完成)。

正确的实现代码如下:

var cursor uint64 = 0
var keyFound bool
const count = 1000
const matchPattern = "*"

for {
    // 执行SCAN命令,传入当前游标
    res := client.Do(ctx, client.B().Scan().Cursor(cursor).Match(matchPattern).Count(count).Build())
    if res.Err() != nil {
        fmt.Printf("scan error: %v\n", res.Err())
        break
    }

    se, err := res.AsScanEntry()
    if err != nil {
        fmt.Printf("convert to scan entry error: %v\n", err)
        break
    }

    // 遍历当前批次的键
    for _, key := range se.Elements {
        fmt.Printf("%v\n", key)
        if key == keyLookingFor {
            keyFound = true
            goto scanDone
        }
    }

    // 更新游标,准备下一次扫描
    cursor = se.Cursor
    if cursor == 0 {
        break
    }
}

scanDone:
// 后续处理逻辑

关键说明:

  • 维护一个cursor变量,每次执行SCAN时传入当前游标,用返回的新游标更新它
  • 循环执行直到游标变为0,这是Redis SCAN命令的标准遍历逻辑
  • 每一批次处理se.Elements中的键,找到目标后可直接终止遍历
  • 注意处理命令执行和类型转换的错误,避免程序panic

内容的提问来源于stack exchange,提问作者Harish Reddy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 19:27:33