godis icon indicating copy to clipboard operation
godis copied to clipboard

add scan command

Open NaNShaner opened this issue 2 years ago • 6 comments

add scan command

NaNShaner avatar Jul 24 '23 13:07 NaNShaner

@HDT3213 貌似是raft这块的逻辑

NaNShaner avatar Jul 24 '23 14:07 NaNShaner

两个大问题

  1. 解析命令行逻辑过于晦涩, 可以参考一下 execSet 的实现

  2. 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
    }
} 

HDT3213 avatar Jul 29 '23 08:07 HDT3213

按照您的建议做了一些修改,貌似test failed。略有些不解🤔。

NaNShaner avatar Aug 05 '23 13:08 NaNShaner

=== RUN   TestScan


    keys_test.go:332: test failed




--- FAIL: TestScan (0.05s)

新加的 TestScan 挂了

HDT3213 avatar Aug 09 '23 01:08 HDT3213

我本地跑是正常的

image

NaNShaner avatar Aug 09 '23 07:08 NaNShaner

知道了, 每次scan迭代返回的key是无序的,所以在test比对的时候会偶发不一致。

NaNShaner avatar Aug 13 '23 01:08 NaNShaner