在etcd v3.0.x中,如何请求具有给定前缀的所有密钥?

时间:2016-07-13 13:00:01

标签: etcd

在etcd 3.0.x中,引入了一个新的API,我只是在阅读它。在RangeRequest对象中,有一件事我不清楚。在description of the property range_end中,它说:

  

如果range_end比给定键大一点,   然后范围请求获得带有前缀(给定密钥)的所有密钥。

这是完整的文字,提供一些背景信息:

// key is the first key for the range. If range_end is not given, the request only looks up key.
bytes key = 1;
// range_end is the upper bound on the requested range [key, range_end).
// If range_end is '\0', the range is all keys >= key.
// If the range_end is one bit larger than the given key,
// then the range requests get the all keys with the prefix (the given key).
// If both key and range_end are '\0', then range requests returns all keys.
bytes range_end = 2;

我的问题是:

是什么意思
  

如果range_end比给定的键大一点

?这是否意味着range_endkey长1位?这是否意味着当解释为整数时它必须是key+1?如果是后者,在哪个编码?

3 个答案:

答案 0 :(得分:1)

有一个PR可以解决这种混乱。

  

如果range_end是关键加一(例如," aa" +1 ==" ab"," a \ xff" +1 ==&#34 ; b&#34),   然后范围请求获取所有以键为前缀的键。

更新:

var key = "/aaa"
var range_end = "/aa" + String.fromCharCode("a".charCodeAt(2) + 1);

答案 1 :(得分:0)

key的最后一个字节大一点。
例如,如果key为“09903x”,则range_end应为“09903y”。
发送到etcd服务器时只有字节流,所以你应该关心驱动程序的序列化,并确定range_end的值。

答案 2 :(得分:0)

一个很棒的TypeScript示例:https://github.com/mixer/etcd3/blob/7691f9bf227841e268c3aeeb7461ad71872df878/src/util.ts#L25

使用TextEncoder / TextDecoder的工作js示例:

function endRangeForPrefix(value) {
    let textEncoder = new TextEncoder();
    let encodeValue = textEncoder.encode(value);

    for (let i = encodeValue.length - 1; i >= 0; i--) {
        if (encodeValue[i] < 0xff) {
            encodeValue[i]++;
            encodeValue = encodeValue.slice(0, i + 1);

            let textDecoder = new TextDecoder();
            let decode = textDecoder.decode(encodeValue);
            return decode;
        }
    }

    return '';
}