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
相关产品推荐
相关产品推荐

