godis
godis copied to clipboard
add scan command
add scan command
@HDT3213 貌似是raft这块的逻辑
两个大问题
-
解析命令行逻辑过于晦涩, 可以参考一下 execSet 的实现
-
scan 命令不保证返回的元素数一定等于 count 参数,但是保证: 「从遍历开始直到完整遍历结束期间, 一直存在于数据集内的所有元素都会被返回」。如果到了 count 就中止的话,当前shard 中可能有一些 key 在遍历期间一直存在但因为遍历中止未被返回。
所以应完整遍历shard, 当 len(result) >= count 后返回即可。
for _, shard := range shards {
for k, _ := range shard.m {
result.add(key)
}
if len(result) >= count {
break
}
}
按照您的建议做了一些修改,貌似test failed。略有些不解🤔。
=== RUN TestScan
keys_test.go:332: test failed
--- FAIL: TestScan (0.05s)
新加的 TestScan 挂了
我本地跑是正常的
知道了, 每次scan迭代返回的key是无序的,所以在test比对的时候会偶发不一致。