Клиент etcd3 Go - Как разбить большие наборы ключей на страницы?

Кажется, что разбиение на страницы с помощью большого набора ключей включает использование параметров GetFromKey() и WithLimit() для Get(). Например, если я хочу получить 2 страницы из 10 элементов, я бы сделал что-то вроде:

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 новых элементов.

Это правильный способ разбить на страницы или я что-то упустил?

1 ответ

Глядя на следующий код clientv3, можно вычислить следующий ключ, добавив 0x00 до последнего ключа.

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

Тем не менее, я предпочитаю игнорировать первый ключ со 2-й и последующих страниц.

Другие вопросы по тегам