Redis SetScan返回所有集合成员

Redis SetScan返回所有集合成员,redis,stackexchange.redis,nosql,Redis,Stackexchange.redis,Nosql,在一个简单的测试中,我有一组10k元素。我注意到,在第一个SetScan调用中,它使用0游标返回整个集合和下一个游标,下一个游标将返回多个元素,另一个游标将生成完全相同的结果和游标 下面的代码将在无限循环中运行 var cursor = 0L; do { var result = redis.SetScan("key", cursor: cursor, pageSize: 100); set.AddRange(result); cursor = ((IScannin

在一个简单的测试中,我有一组10k元素。我注意到,在第一个
SetScan
调用中,它使用0游标返回整个集合和下一个游标,下一个游标将返回多个元素,另一个游标将生成完全相同的结果和游标

下面的代码将在无限循环中运行

var cursor = 0L;

do
{
    var result = redis.SetScan("key", cursor: cursor, pageSize: 100);

    set.AddRange(result);

    cursor = ((IScanningCursor)result).Cursor;

} while (cursor > 0);

改变页面大小不会产生影响。

SetScan会在迭代结果时在内部处理光标。此上下文中的PageSize是需要新页面时SetScan作为计数传递给SetScan的内容。您不需要自己处理游标逻辑。只需迭代可枚举项:

foreach(var redisValue in redis.SetScan("key")
{
    set.Add(redisValue);
}

如果需要在中间停止枚举并在带外继续其他地方,则会显示游标。但是我仍然不明白为什么我的示例代码不能正常工作。所提供的代码是否有问题?如果返回的游标与传入的游标相同,则完成设置扫描。您不需要循环,因为第一次调用将始终返回所有元素,因为您不限制迭代器对结果的使用。set.AddRange(结果);将导致迭代器(result)进行获取整个集合所需的所有Redis调用。