【问题标题】:etcd3 Go Client - How to paginate large sets of keys?etcd3 Go Client - 如何对大量键进行分页?
【发布时间】:2018-06-13 14:22:08
【问题描述】:

似乎通过大量键进行分页涉及使用 Get() 的 WithFromKey() 和 WithLimit() 选项。例如,如果我想获取 10 个项目的 2 页,我会执行以下操作:

opts := []clientv3.OpOption {
    clientv3.WithPrefix(),
    clientv3.WithSort(clientv3.SortByKey, clientv3.SortAscend),
    clientv3.WithLimit(10),
}

gr, err := kv.Get(ctx, "key", opts...)
if err != nil {
    log.Fatal(err)
}

fmt.Println("--- First page ---")
for _, item := range gr.Kvs {
    fmt.Println(string(item.Key), string(item.Key))
}

lastKey := string(gr.Kvs[len(gr.Kvs)-1].Value)

fmt.Println("--- Second page ---")
opts = append(opts, clientv3.WithFromKey())
gr, _ = kv.Get(ctx, lastKey, opts...)

// Skipping the first item, which the last item from from the previous Get
for _, item := range gr.Kvs[1:] {
    fmt.Println(string(item.Key), string(item.Value))
}

问题是最后一个键作为第二页的第一项被再次提取,我需要跳过它,只有 9 个新项目。

这是正确的分页方式还是我遗漏了什么?

【问题讨论】:

    标签: go etcd3


    【解决方案1】:

    查看以下 clientv3 代码,可以通过将 0x00 附加到最后一个键来计算下一个键。

    https://github.com/coreos/etcd/blob/88acced1cd7ad670001d1280b97de4fe7b647687/clientv3/op.go#L353

    也就是说,我更喜欢忽略第二页和后续页面中的第一个键。

    【讨论】:

      猜你喜欢
      • 2014-04-05
      • 2015-05-02
      • 2012-08-04
      • 2020-02-15
      • 1970-01-01
      • 2021-07-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多