如何在C#中更新Redis SCAN的游标值?
解决Redis SCAN游标更新问题
你的代码核心问题是:当前调用的Keys重载不会返回SCAN命令生成的新游标值,导致cursor变量始终保持初始的0,要么陷入无限循环,要么根本没遍历完所有键。
StackExchange.Redis提供了带out参数的Keys重载,专门用来获取SCAN返回的游标更新值。修改后的代码如下:
public int Count() { var server = _conn.GetServer(_conn.GetEndPoints().First()); int count = 0; var cursor = 0L; do { // 使用带out参数的Keys重载,每次调用后cursor会被更新为SCAN返回的新游标 var keys = server.Keys(out cursor, pattern: GetPattern(), pageSize: batchSize); count += keys.Count(); } while (cursor != 0); // 当游标返回0时,说明遍历完成 return count; }
关键说明
- 调用
server.Keys(out cursor, ...)时,方法会通过out参数将SCAN命令返回的新游标值赋值给cursor变量 - 每次循环都会用更新后的游标继续遍历下一批键,直到游标返回0,代表所有键已遍历完成
- 这样就能正确基于SCAN的分页遍历逻辑,统计出Redis中符合模式的总键数
内容的提问来源于stack exchange,提问作者ANEES
相关产品推荐
相关产品推荐

