1

キーの大規模なセットによるページネーションには、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))
}

問題は、最後のキーが 2 ページ目の最初のアイテムとして再度フェッチされることです。これをスキップする必要があり、新しいアイテムは 9 つだけです。

それはページネーションの適切な方法ですか、それとも何か不足していますか?

4

1 に答える 1